У мене "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не є портативним для нічого, крім прямої рядка, яка не починається з -і не містить послідовностей евакуації. Його поведінка змінюється навіть для bash вбудованого, залежно від того, як він був складений та чи XPG_ECHOвстановлений. Якщо припустити, що рядок не містить послідовностей відходу, це повинно бути добре, але 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не є портативним для нічого, крім прямої рядка, яка не починається з -і не містить послідовностей евакуації. Його поведінка змінюється навіть для bash вбудованого, залежно від того, як він був складений та чи XPG_ECHOвстановлений. Крім того, ви завжди повинні подвоїти цитати змінних розширень та підстановки команд (за певними винятками, де це не потрібно, але це також не шкодить). З такою струною, як ОП, це повинно бути добре, але якщо ви хочете, щоб переконатися, 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безпосередньо перед підрядкою, яку ви хочете витягнути?