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