Mam ciąg w następnym formacie
id;some text here with possible ; inside
i chcę podzielić go na 2 łańcuchy przez pierwsze wystąpienie ;
. Tak powinno być: id
isome text here with possible ; inside
Wiem, jak podzielić ciąg (na przykład za pomocą cut -d ';' -f1
), ale zostanie on podzielony na więcej części, ponieważ mam ;
wewnątrz lewej części.
bash
shell-script
string
split
gakhov
źródło
źródło
id
istring
Odpowiedzi:
cut
brzmi jak odpowiednie narzędzie do tego:Ale
read
jest jeszcze bardziej odpowiedni:źródło
read
odkąd używambash
. Dziękuję @manatwork!cut
Podejście będzie działać tylko wtedy, gdy „$ s” nie zawiera znaki nowej linii. read znajduje się w dowolnej powłoce podobnej do Bourne'a. <<< jest w rc, zsh i najnowszych wersjach bash i ksh93 i jest tym, który nie jest standardem.-a
jakiegoś powodu, gdy wspomniećbash
„sread
. (Widocznie bezużyteczne tutaj.)-f 2-
wstring="$( cut -d ';' -f 2- <<< "$s" )"; echo "$string"
poleceniu. To ignoruje resztę ograniczników w ciągu wydruku. Nie jest to oczywiste, gdy patrzy się na stronę podręcznika użytkownikacut
Z dowolnym standardowym sh (w tym bash):
read
oparte na rozwiązaniach działałyby dla wartości pojedynczych znaków (a przy niektórych powłokach, jednobajtowych) wartości$sep
innych niż spacja, tabulator lub nowa linia i tylko wtedy,$s
gdy nie zawiera znaków nowej linii.cut
oparte na rozwiązaniach działałyby tylko wtedy, gdyby$s
nie zawierały znaków nowej linii.sed
można opracować rozwiązania, które obsługują wszystkie przypadki narożne o dowolnej wartości$sep
, ale nie warto posuwać się tak daleko, gdy wbudowane jest wsparcie dla powłoki.źródło
Jak już wspomniałeś, chcesz przypisać wartości do identyfikatora i ciągu
najpierw przypisz wzór do zmiennej (powiedzmy str)
Teraz masz swoje wartości w odpowiednich zmiennych
źródło
some_command
, wtedy wzorzec zostanie zapisany w 1 $ i użyje powyższego kodu z 1 zamiast strOprócz innych rozwiązań możesz wypróbować coś
regex
opartego na:lub w zależności od tego, co dokładnie próbujesz zrobić, możesz użyć
gdzie
\1
i\2
zawierają dwa podciągi, których chciałeś.źródło
Rozwiązanie w standardowym bashu:
źródło