从字符串变量中提取第二个单词

Pra*_*ain 19 bash string variable

我有一个"rtcpOnNbActive true"存储在变量中的字符串x。我想提取“true”作为子字符串并存储在一个变量中。我怎样才能做到这一点?

jhe*_*ran 28

试试这个方法:

y=$(echo $x | awk '{print $2}')
echo $y
Run Code Online (Sandbox Code Playgroud)
  • echo $x显示 的值x
  • awk '{print $2}'打印先前显示的第二个字段x
  • $(...)保持输出并让其分配给y.

  • `echo $x` 是**不** _显示 `x`_ 的值。`printf '%s\n' "$x"` 将是。 (3认同)
  • `awk '{print $2}'` 打印先前显示的 `x` 的每一行**的第二个字段**。 (3认同)

PM *_*ing 10

假设您要提取的子字符串之前至少有一个空格(并且该子字符串不包含任何空格),您可以通过一个简单的参数扩展来做到这一点:

x="rtcpOnNbActive     true"
y="${x##* }"
echo "[$y]"
Run Code Online (Sandbox Code Playgroud)

输出

[true]
Run Code Online (Sandbox Code Playgroud)

  • 除了不以“-”开头且不包含任何转义序列的文字字符串之外,“echo”不可移植。它的行为甚至对于 bash 内置函数也会有所不同,这取决于它的编译方式以及是否设置了 `XPG_ECHO`。假设字符串不包含转义序列,这应该没问题,但 `printf '[%s]\n' "$y"` 仍然更好。 (3认同)

Hac*_*lic 5

你可以使用 awk:

echo "rtcpOnNbActive         true" | awk '{print $NF}'
true
Run Code Online (Sandbox Code Playgroud)

NF 当前记录中的字段数

使用 sed:

echo "rtcpOnNbActive         true" | sed 's/.* //g'
true
Run Code Online (Sandbox Code Playgroud)

使用字符串表达式:

 a="rtcpOnNbActive         true"
 echo ${a##* }
 true
Run Code Online (Sandbox Code Playgroud)

使用 grep:

 echo "rtcpOnNbActive         true" | grep -Eo "[a-z]+$"
 true
Run Code Online (Sandbox Code Playgroud)

-o 仅给出精确匹配,[a-z]+将匹配来自 az 的字母和$末尾的意思

  • 请不要在同一问题中为您发布 [other answer](http://unix.stackexchange.com/a/174039/72456) 的内容。 (3认同)

ken*_*orb 5

可以为此使用 bash 数组,只需将您的str括号放在里面。例如:

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

str="first second third"
arr1=($str)
echo ${arr1[1]}
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的方法,因为它非常简单并且不易出错。 (2认同)