У меня есть строка, "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
перед подстрокой, которую вы хотите извлечь?