У меня есть строка, "rtcpOnNbActive true"хранящаяся в переменной x. Я хочу извлечь "true" как подстроку и сохранить в переменной. Как я могу это сделать?
echo $xэто не отображать значениеx . printf '%s\n' "$x"было бы.
Стефан Шазелас
2
awk '{print $2}'печатает второе поле каждой строки ранее отображенного x.
Стефан Шазелас
9
Предполагая, что перед подстрокой есть хотя бы один пробел, который вы хотите извлечь (и что подстрока не содержит пробелов), вы можете сделать это с помощью простого расширения параметра:
echoне переносится ни для чего, кроме литеральной строки, которая не начинается с -и не содержит escape-последовательностей. Его поведение варьируется даже для встроенного bash, в зависимости от того, как он был скомпилирован и установлен ли XPG_ECHO. Предполагая, что строка не содержит escape-последовательностей, это должно быть хорошо, но printf '[%s]\n' "$y"все же лучше.
nyuszika7h
1
@ nyuszika7h: Хороший вопрос, и после прочтения Стефана Шазеласа произнесите подобные вещи здесь и в других недавних вопросах, я действительно должен отказаться от своей привычки использовать echoдля отображения значения переменных, даже в таких «выбрасываемых» примерах, как этот.
Не размещайте содержание другого ответа на ваш вопрос в том же вопросе, пожалуйста.
αғsнιη 13.12.14
1
на что другие отвечают ????
Hackaholic
он может сохранить это в переменной, это не имеет большого значения здесь
Hackaholic
echoне переносится ни для чего, кроме литеральной строки, которая не начинается с -и не содержит escape-последовательностей. Его поведение варьируется даже для встроенного bash, в зависимости от того, как он был скомпилирован и установлен ли XPG_ECHO. Кроме того, вы всегда должны использовать двойные кавычки для раскрытия переменных и подстановки команд (за некоторыми исключениями, когда это необязательно, но это также не приносит никакого вреда). Со строкой, подобной OP, это должно быть хорошо, но если вы хотите убедиться, printf '%s\n' "${a##* }"что будет лучше.
nyuszika7h
3
Для этого можно использовать массивы bash, например:
зачем привлекать read? Это не readто, что делает раскол - это так $IFS. По какой-то причине многие считают нормальным разделение $IFSтолько тогда, когда readэто происходит. Вы можете просто сделать: set -f; IFS=' '; printf %.0s%s $xили что угодно. В любом случае - здесь нужно указать $IFSзначение.
mikeserv
@mikeserv, он readиспользует разделение IFS, проверь документацию . Основным преимуществом использования read является то, что он устанавливает переменные (что является требованием OP) и, учитывая, что он может разбивать строки и заполнять массив, хорошо подходит для извлечения произвольных полей из строки. Кроме того, я предполагаю, что IFSздесь используется значение по умолчанию , но его достаточно легко установить, если необходимо, это IFS=$' \n\t' read -r _ y <<<"$x"поможет
iruvar
нет, это не так. readприсваивает, $IFSразбивает. если вы хотите заполнить массив, используйте set- в этом случае вам не нужна искусственная бессмысленная ерунда здесь. unset IFSполучает поведение $ IFS по умолчанию.
mikeserv
@mikeserv, ты не в моем списке рождественских открыток.
x
перед подстрокой, которую вы хотите извлечь?Ответы:
Попробуйте так:
echo $x
отобразить значениеx
.awk '{print $2}'
печатает второе поле ранее отображенногоx
.$(
...)
удерживайте вывод и позвольте ему присвоитьy
.источник
echo $x
это не отображать значениеx
.printf '%s\n' "$x"
было бы.awk '{print $2}'
печатает второе поле каждой строки ранее отображенногоx
.Предполагая, что перед подстрокой есть хотя бы один пробел, который вы хотите извлечь (и что подстрока не содержит пробелов), вы можете сделать это с помощью простого расширения параметра:
вывод
источник
echo
не переносится ни для чего, кроме литеральной строки, которая не начинается с-
и не содержит escape-последовательностей. Его поведение варьируется даже для встроенного bash, в зависимости от того, как он был скомпилирован и установлен лиXPG_ECHO
. Предполагая, что строка не содержит escape-последовательностей, это должно быть хорошо, ноprintf '[%s]\n' "$y"
все же лучше.echo
для отображения значения переменных, даже в таких «выбрасываемых» примерах, как этот.Вы можете использовать awk:
NF
номер поля в текущей записииспользуя sed:
используя строковое выражение:
используя grep:
-o это дает только точное совпадение,
[a-z]+
будет соответствовать букве от az и$
означает в концеисточник
echo
не переносится ни для чего, кроме литеральной строки, которая не начинается с-
и не содержит escape-последовательностей. Его поведение варьируется даже для встроенного bash, в зависимости от того, как он был скомпилирован и установлен лиXPG_ECHO
. Кроме того, вы всегда должны использовать двойные кавычки для раскрытия переменных и подстановки команд (за некоторыми исключениями, когда это необязательно, но это также не приносит никакого вреда). Со строкой, подобной OP, это должно быть хорошо, но если вы хотите убедиться,printf '%s\n' "${a##* }"
что будет лучше.Для этого можно использовать массивы bash, например:
источник
Вы могли бы использовать
read
встроенныйисточник
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 по умолчанию.