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


11

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


x您要提取的子字符串之前是否总是会有空格?
下午14年

Answers:


21

尝试这种方式:

y=$(echo $x | awk '{print $2}')
echo $y
  • echo $x显示的值x
  • awk '{print $2}'打印先前显示的第二个字段x
  • $(... )保留输出,然后将其分配给y

3
echo $x 显示的值xprintf '%s\n' "$x"将会。
斯特凡Chazelas

2
awk '{print $2}'打印先前显示的每一行的第二个字段x
斯特凡Chazelas

9

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

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

输出

[true]

3
echo除了不是以开头-且不包含任何转义序列的文字字符串之外,它不可移植。即使对于内置的bash,它的行为也有所不同,这取决于它的编译方式以及是否XPG_ECHO设置。假设该字符串不包含任何转义序列,这应该没问题,但printf '[%s]\n' "$y"还是更好。
nyuszika7h 2014年

1
@ nyuszika7h:很好,在读完StéphaneChazelas在这里和其他最近的问题中说了类似的话后echo,即使在这样的“扔掉”示例中,我也应该打破习惯来显示变量的值。
PM 2Ring

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]+将匹配来自z的字母和$末尾的均值


2
请不要在同一问题中发布其他答案的内容。
αғsнιη

1
别人怎么回答???
Hackaholic 2014年

他可以将其保存在变量中,这并不是什么大问题
Hackaholic 2014年

echo除了不是以开头-且不包含任何转义序列的文字字符串之外,它不可移植。即使对于内置的bash,它的行为也有所不同,这取决于它的编译方式以及是否XPG_ECHO设置。同样,您应该始终对变量扩展和命令替换使用双引号(在某些例外情况下,虽然没有必要,但也没有任何害处)。使用OP之类的字符串,这应该没问题,但是如果要确保printf '%s\n' "${a##* }"会更好。
nyuszika7h 2014年

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涉及时才可以拆分w / 。你可以这样做:set -f; IFS=' '; printf %.0s%s $x或什么的。无论如何-您需要在$IFS此处指定的值。
mikeserv

@mikeserv,read使用进行拆分IFS,请查看文档。使用read的主要优点是它可以设置变量(这是OP的要求),并且由于它可以拆分字符串并填充数组,因此非常适合从字符串中提取任意字段。另外,我假设IFS这里是默认值,但是如果需要的话,很容易设置IFS=$' \n\t' read -r _ y <<<"$x"就可以解决问题
iruvar 2014年

不,这不对。read分配,$IFS拆分。如果您想填充数组,请使用set-在这种情况下,您不需要人工的此处字符串废话。unset IFS获取默认的$ IFS行为。
mikeserv 2014年

@mikeserv,您不在我的圣诞贺卡列表中。
iruvar 2014年

呸骗子。圣诞是吸盘。
mikeserv 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.