У меня есть строка, "rtcpOnNbActive true"хранящаяся в переменной x. Я хочу извлечь "true" как подстроку и сохранить в переменной. Как я могу это сделать?
У меня есть строка, "rtcpOnNbActive true"хранящаяся в переменной x. Я хочу извлечь "true" как подстроку и сохранить в переменной. Как я могу это сделать?
Ответы:
Попробуйте так:
y=$(echo $x | awk '{print $2}')
echo $y
echo $xотобразить значение x.awk '{print $2}'печатает второе поле ранее отображенного x.$(... )удерживайте вывод и позвольте ему присвоить y.echo $xэто не отображать значениеx . printf '%s\n' "$x"было бы.
awk '{print $2}'печатает второе поле каждой строки ранее отображенного x.
Предполагая, что перед подстрокой есть хотя бы один пробел, который вы хотите извлечь (и что подстрока не содержит пробелов), вы можете сделать это с помощью простого расширения параметра:
x="rtcpOnNbActive true"
y="${x##* }"
echo "[$y]"
вывод
[true]
echoне переносится ни для чего, кроме литеральной строки, которая не начинается с -и не содержит escape-последовательностей. Его поведение варьируется даже для встроенного bash, в зависимости от того, как он был скомпилирован и установлен ли XPG_ECHO. Предполагая, что строка не содержит escape-последовательностей, это должно быть хорошо, но printf '[%s]\n' "$y"все же лучше.
echoдля отображения значения переменных, даже в таких «выбрасываемых» примерах, как этот.
Вы можете использовать awk:
echo "rtcpOnNbActive true" | awk '{print $NF}'
true
NF номер поля в текущей записи
используя sed:
echo "rtcpOnNbActive true" | sed 's/.* //g'
true
используя строковое выражение:
a="rtcpOnNbActive true"
echo ${a##* }
true
используя grep:
echo "rtcpOnNbActive true" | grep -Eo "[a-z]+$"
true
-o это дает только точное совпадение, [a-z]+будет соответствовать букве от az и $означает в конце
echoне переносится ни для чего, кроме литеральной строки, которая не начинается с -и не содержит escape-последовательностей. Его поведение варьируется даже для встроенного bash, в зависимости от того, как он был скомпилирован и установлен ли XPG_ECHO. Кроме того, вы всегда должны использовать двойные кавычки для раскрытия переменных и подстановки команд (за некоторыми исключениями, когда это необязательно, но это также не приносит никакого вреда). Со строкой, подобной OP, это должно быть хорошо, но если вы хотите убедиться, printf '%s\n' "${a##* }"что будет лучше.
Вы могли бы использовать readвстроенный
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read? Это не readто, что делает раскол - это так $IFS. По какой-то причине многие считают нормальным разделение $IFS только тогда, когда readэто происходит. Вы можете просто сделать: set -f; IFS=' '; printf %.0s%s $xили что угодно. В любом случае - здесь нужно указать $IFSзначение.
readиспользует разделение IFS, проверь документацию . Основным преимуществом использования read является то, что он устанавливает переменные (что является требованием OP) и, учитывая, что он может разбивать строки и заполнять массив, хорошо подходит для извлечения произвольных полей из строки. Кроме того, я предполагаю, что IFSздесь используется значение по умолчанию , но его достаточно легко установить, если необходимо, это IFS=$' \n\t' read -r _ y <<<"$x"поможет
readприсваивает, $IFSразбивает. если вы хотите заполнить массив, используйте set- в этом случае вам не нужна искусственная бессмысленная ерунда здесь. unset IFSполучает поведение $ IFS по умолчанию.
xперед подстрокой, которую вы хотите извлечь?