Odpowiedzi:
Przykład mógłby być przydatny, ale jeśli dobrze cię zrozumiałem, zadziałałoby:
echo "Hello: world" | cut -f1 -d":"
Spowoduje to konwersję „hello: world” na „hello”.
basename
i cut
, zobacz odpowiedź Dennisa poniżej
cut
może czytać ze standardowego wejścia, więc jest to lepsze, zwłaszcza gdy masz bardzo długi ciąg znaków, który musisz przetworzyć, np. zawartość pliku.
hello: world
. To połowa odpowiedzi.
W Bash (i ksh, zsh, myślnik itp.) Możesz użyć interpretacji parametrów, %
która usunie znaki z końca łańcucha lub #
usunie znaki z początku łańcucha. Jeśli użyjesz jednego z tych znaków, najmniejszy pasujący ciąg zostanie usunięty. Jeśli podwoisz znak, najdłuższy zostanie usunięty.
$ a='hello:world'
$ b=${a%:*}
$ echo "$b"
hello
$ a='hello:world:of:tomorrow'
$ echo "${a%:*}"
hello:world:of
$ echo "${a%%:*}"
hello
$ echo "${a#*:}"
world:of:tomorrow
$ echo "${a##*:}"
tomorrow
hello:world
będzie hello:wo
, używając ${a%:*}
?
"${a##*:}"
za zdobycie tylko tomorrow
=)
a='hello:world:of:tomorrow'; pattern=''^([^:]*:).*$'
; [[$ a = ~ $ wzór]]; echo "$ {BASH_REMATCH [1]}" ". To pasuje tylko do dwukropka. Jeśli chcesz, aby było to opcjonalne, musisz użyć innego wzorca. Wyjaśnienie wyrażeń regularnych Bash (i ogólnie wyrażeń regularnych) wykracza poza zakres tych komentarzy. Możesz znaleźć inne pytania, które omawiają ten problem lub opublikować własne.
egrep -o '^[^:]*:'
egrep
jest grep with -E
. Tutaj nie ma różnicy od zwykłego grep
. -o
nakazuje grep wydrukować tylko część wiersza, która pasuje do wyrażenia. ^
zakotwicza dopasowanie na początku wiersza. [^:]*
dopasowuje zero lub więcej znaków, które nie są tym :
znakiem. :
pasuje do znaku :
.
Załóżmy, że masz ścieżkę z plikiem w tym formacie:
/dirA/dirB/dirC/filename.file
Teraz potrzebujesz tylko ścieżki, która zawiera cztery „/”. Rodzaj
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/"
a twoje wyjście będzie
/dirA/dirB/dirC
Zaletą używania cut jest to, że możesz również wyciąć katalog uppest, a także plik (w tym przykładzie), więc jeśli wpiszesz
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/"
Twój wynik byłby
/dirA/dirB
Chociaż możesz zrobić to samo z drugiej strony ciągu, nie miałoby to większego sensu w tym przypadku, jak pisanie
$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"
prowadzi do
dirA/dirB/dirC
W innych przypadkach ostatni przypadek może być również pomocny. Pamiętaj, że na początku ostatniego wyjścia nie ma znaku „/”.
odetnij wszystko po ostatnim wystąpieniu „:”
cat fileListingPathsAndFiles.txt | grep -o '^.*:'
i jeśli chcesz porzucić to ostatnie „:”
cat file.txt | grep -o '^.*:' | sed 's/:$//'
@ kp123: którą chcesz zamienić :
z /
(gdzie sed jelita grubego powinny być \/
)
cut
działa, ale odpowiedź I Dennisa jest lepsza i bardziej elastyczna. Czy ktoś wie, czy wywołuje nowy proces, taki jakcut
?