echo $xjest nie wyświetla wartośćx . printf '%s\n' "$x"byłoby.
Stéphane Chazelas,
2
awk '{print $2}'wypisuje drugie pole każdego wiersza poprzednio wyświetlanego x.
Stéphane Chazelas,
9
Zakładając, że przed podciągiem jest co najmniej jedna spacja, którą chcesz wyodrębnić (i że podłańcuch nie zawiera spacji), możesz to zrobić za pomocą prostego rozszerzenia parametru:
echonie jest przenośny na nic innego niż ciąg literalny, który nie zaczyna się od -i nie zawiera żadnych sekwencji specjalnych. Jego zachowanie różni się nawet dla wbudowanego basha, w zależności od tego, jak zostało skompilowane i czy XPG_ECHOjest ustawione. Zakładając, że ciąg nie zawiera sekwencji ucieczki, powinno to być w porządku, ale i tak printf '[%s]\n' "$y"jest lepsze.
nyuszika7h,
1
@ nyuszika7h: Dobra uwaga i po przeczytaniu Stéphane'a Chazelasa mówię tutaj podobne rzeczy i w innych ostatnich pytaniach naprawdę powinienem porzucić nawyk używania echowyświetlania wartości zmiennych, nawet w przykładach takich jak „wyrzucanie”.
może uratować go w zmiennej, to nie jest wielka sprawa
Hackaholic
echonie jest przenośny na nic innego niż ciąg literalny, który nie zaczyna się od -i nie zawiera żadnych sekwencji specjalnych. Jego zachowanie różni się nawet dla wbudowanego basha, w zależności od tego, jak zostało skompilowane i czy XPG_ECHOjest ustawione. Powinieneś także zawsze podwójnie cytować rozszerzenia zmiennych i zastępować polecenia (z pewnymi wyjątkami, gdzie nie jest to konieczne, ale nie powoduje też żadnej szkody). Z ciągiem takim jak OP, powinno to być w porządku, ale jeśli chcesz się upewnić, printf '%s\n' "${a##* }"że będzie lepiej.
dlaczego wiązać read? To nie readrobi podziału - jest $IFS. Z jakiegoś powodu wiele osób uważa, że podzielenie w / jest w porządku $IFStylko wtedy, gdy readjest zaangażowany. Możesz po prostu zrobić: set -f; IFS=' '; printf %.0s%s $xlub cokolwiek. W każdym razie - musisz podać $IFStutaj wartość.
mikeserv
@ Mikeserv, readdokonuje podziału za pomocą IFS, sprawdź dokumentację . Główną zaletą korzystania z odczytu jest to, że ustawia zmienne (co jest wymaganiem OP), a biorąc pod uwagę, że może dzielić łańcuchy i zapełniać tablicę, nadaje się do wydobywania dowolnych pól z łańcucha. Dodatkowo jestem zakładając domyślnie IFStutaj, ale jest to dość łatwe do zbioru W razie potrzeby IFS=$' \n\t' read -r _ y <<<"$x"rade
Iruvar
nie, nie jest. readprzypisuje, $IFSdzieli. jeśli chcesz zapełnić tablicę, użyj set- w tym przypadku nie potrzebujesz sztucznego nonsensownego ciągu znaków. unset IFSdostaje domyślne zachowanie $ IFS.
mikeserv
@ Mikeserv, nie ma cię na liście kartek świątecznych.
x
tuż przed podciągiem, który chcesz wyodrębnić?Odpowiedzi:
Wypróbuj w ten sposób:
echo $x
wyświetl wartośćx
.awk '{print $2}'
wypisuje drugie pole poprzednio wyświetlanegox
.$(
...)
przytrzymaj wynik i pozwól mu go przypisaćy
.źródło
echo $x
jest nie wyświetla wartośćx
.printf '%s\n' "$x"
byłoby.awk '{print $2}'
wypisuje drugie pole każdego wiersza poprzednio wyświetlanegox
.Zakładając, że przed podciągiem jest co najmniej jedna spacja, którą chcesz wyodrębnić (i że podłańcuch nie zawiera spacji), możesz to zrobić za pomocą prostego rozszerzenia parametru:
wynik
źródło
echo
nie jest przenośny na nic innego niż ciąg literalny, który nie zaczyna się od-
i nie zawiera żadnych sekwencji specjalnych. Jego zachowanie różni się nawet dla wbudowanego basha, w zależności od tego, jak zostało skompilowane i czyXPG_ECHO
jest ustawione. Zakładając, że ciąg nie zawiera sekwencji ucieczki, powinno to być w porządku, ale i takprintf '[%s]\n' "$y"
jest lepsze.echo
wyświetlania wartości zmiennych, nawet w przykładach takich jak „wyrzucanie”.możesz użyć awk:
NF
liczba pól w bieżącym rekordzieprzy użyciu sed:
za pomocą wyrażenia łańcuchowego:
używając grep:
-o daje tylko dokładne dopasowanie,
[a-z]+
dopasuje literę od az i$
oznacza na końcuźródło
echo
nie jest przenośny na nic innego niż ciąg literalny, który nie zaczyna się od-
i nie zawiera żadnych sekwencji specjalnych. Jego zachowanie różni się nawet dla wbudowanego basha, w zależności od tego, jak zostało skompilowane i czyXPG_ECHO
jest ustawione. Powinieneś także zawsze podwójnie cytować rozszerzenia zmiennych i zastępować polecenia (z pewnymi wyjątkami, gdzie nie jest to konieczne, ale nie powoduje też żadnej szkody). Z ciągiem takim jak OP, powinno to być w porządku, ale jeśli chcesz się upewnić,printf '%s\n' "${a##* }"
że będzie lepiej.Można do tego użyć tablic bash, np .:
źródło
Możesz użyć
read
wbudowanegoźródło
read
? To nieread
robi podziału - jest$IFS
. Z jakiegoś powodu wiele osób uważa, że podzielenie w / jest w porządku$IFS
tylko wtedy, gdyread
jest zaangażowany. Możesz po prostu zrobić:set -f; IFS=' '; printf %.0s%s $x
lub cokolwiek. W każdym razie - musisz podać$IFS
tutaj wartość.read
dokonuje podziału za pomocąIFS
, sprawdź dokumentację . Główną zaletą korzystania z odczytu jest to, że ustawia zmienne (co jest wymaganiem OP), a biorąc pod uwagę, że może dzielić łańcuchy i zapełniać tablicę, nadaje się do wydobywania dowolnych pól z łańcucha. Dodatkowo jestem zakładając domyślnieIFS
tutaj, ale jest to dość łatwe do zbioru W razie potrzebyIFS=$' \n\t' read -r _ y <<<"$x"
raderead
przypisuje,$IFS
dzieli. jeśli chcesz zapełnić tablicę, użyjset
- w tym przypadku nie potrzebujesz sztucznego nonsensownego ciągu znaków.unset IFS
dostaje domyślne zachowanie $ IFS.