Mam ciąg "rtcpOnNbActive true"
przechowywany w zmiennej x
. Chcę wyodrębnić „true” jako podciąg i zapisać w zmiennej. W jaki sposób mogę to zrobić?
Mam ciąg "rtcpOnNbActive true"
przechowywany w zmiennej x
. Chcę wyodrębnić „true” jako podciąg i zapisać w zmiennej. W jaki sposób mogę to zrobić?
Odpowiedzi:
Wypróbuj w ten sposób:
y=$(echo $x | awk '{print $2}')
echo $y
echo $x
wyświetl wartość x
.awk '{print $2}'
wypisuje drugie pole poprzednio wyświetlanego x
.$(
... )
przytrzymaj wynik i pozwól mu go przypisać y
.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świetlanego x
.
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:
x="rtcpOnNbActive true"
y="${x##* }"
echo "[$y]"
wynik
[true]
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 czy XPG_ECHO
jest 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.
echo
wyświetlania wartości zmiennych, nawet w przykładach takich jak „wyrzucanie”.
możesz użyć awk:
echo "rtcpOnNbActive true" | awk '{print $NF}'
true
NF
liczba pól w bieżącym rekordzie
przy użyciu sed:
echo "rtcpOnNbActive true" | sed 's/.* //g'
true
za pomocą wyrażenia łańcuchowego:
a="rtcpOnNbActive true"
echo ${a##* }
true
używając grep:
echo "rtcpOnNbActive true" | grep -Eo "[a-z]+$"
true
-o daje tylko dokładne dopasowanie, [a-z]+
dopasuje literę od az i $
oznacza na końcu
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 czy XPG_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żesz użyć read
wbudowanego
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read
? To nie read
robi podziału - jest $IFS
. Z jakiegoś powodu wiele osób uważa, że podzielenie w / jest w porządku $IFS
tylko wtedy, gdy read
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ślnie IFS
tutaj, ale jest to dość łatwe do zbioru W razie potrzeby IFS=$' \n\t' read -r _ y <<<"$x"
rade
read
przypisuje, $IFS
dzieli. jeśli chcesz zapełnić tablicę, użyj set
- w tym przypadku nie potrzebujesz sztucznego nonsensownego ciągu znaków. unset IFS
dostaje domyślne zachowanie $ IFS.
x
tuż przed podciągiem, który chcesz wyodrębnić?