Вилучення другого слова з рядкової змінної


11

У мене "rtcpOnNbActive true"зберігається рядок у змінній x. Я хочу витягнути "true" як підрядку і зберігати в змінній. Як я можу це зробити?


Чи завжди буде пробіл xбезпосередньо перед підрядкою, яку ви хочете витягнути?
PM 2Ring

Відповіді:


21

Спробуйте таким чином:

y=$(echo $x | awk '{print $2}')
echo $y
  • echo $xвідобразити значення x.
  • awk '{print $2}'друкує друге поле попередньо відображеного x.
  • $(... )утримуйте вихід і дозвольте призначити його y.

3
echo $xце НЕ відображати значенняx . printf '%s\n' "$x"було б.
Стефан Шазелас

2
awk '{print $2}'друкує друге поле кожного рядка попередньо відображеного x.
Стефан Шазелас

9

Якщо припустити, що перед підрядкою, яку ви бажаєте витягнути, є щонайменше один пробіл (і що підрядка не містить пробілів), ви можете зробити це за допомогою простого розширення параметра:

x="rtcpOnNbActive     true"
y="${x##* }"
echo "[$y]"

вихід

[true]

3
echoне є портативним для нічого, крім прямої рядка, яка не починається з -і не містить послідовностей евакуації. Його поведінка змінюється навіть для bash вбудованого, залежно від того, як він був складений та чи XPG_ECHOвстановлений. Якщо припустити, що рядок не містить послідовностей відходу, це повинно бути добре, але printf '[%s]\n' "$y"все-таки краще.
nyuszika7h

1
@ nyuszika7h: Добре, і після прочитання Стефана Шазеласа тут говорять подібні речі та в інших останніх питаннях, я дійсно повинен зламати звичку використовувати echoдля відображення значення змінних, навіть у подібних прикладах "викидання".
14:00

4

ви можете використовувати 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 і $означає в кінці


2
Не публікуйте вміст іншої відповіді для вас у тому ж запитанні.
αғsnιη

1
що інші відповідають ????
Хакаголік

він може зберегти його в змінній його не велика справа тут
Hackaholic

echoне є портативним для нічого, крім прямої рядка, яка не починається з -і не містить послідовностей евакуації. Його поведінка змінюється навіть для bash вбудованого, залежно від того, як він був складений та чи XPG_ECHOвстановлений. Крім того, ви завжди повинні подвоїти цитати змінних розширень та підстановки команд (за певними винятками, де це не потрібно, але це також не шкодить). З такою струною, як ОП, це повинно бути добре, але якщо ви хочете, щоб переконатися, printf '%s\n' "${a##* }"було б краще.
nyuszika7h

3

Для цього можна використовувати масиви bash, наприклад:

arr="(first second third)"
echo ${arr[1]}

2

Ви можете використовувати readвбудований

read -r _ y <<<"$x"
printf "%s\n" "$y"
true

навіщо залучати 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, ти не в списку моїх різдвяних листівок.
iruvar

ха-хабу. xmas призначений для присосок.
mikeserv
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.