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 $xwyświetl wartość x.awk '{print $2}'wypisuje drugie pole poprzednio wyświetlanego x.$(... )przytrzymaj wynik i pozwól mu go przypisać y.echo $xjest 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]
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.
echowyś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
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.
Możesz użyć readwbudowanego
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read? To nie readrobi podziału - jest $IFS. Z jakiegoś powodu wiele osób uważa, że podzielenie w / jest w porządku $IFS tylko 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ść.
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
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.
xtuż przed podciągiem, który chcesz wyodrębnić?