Answers:
尝试这种方式:
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]+
将匹配来自z的字母和$
末尾的均值
echo
除了不是以开头-
且不包含任何转义序列的文字字符串之外,它不可移植。即使对于内置的bash,它的行为也有所不同,这取决于它的编译方式以及是否XPG_ECHO
设置。同样,您应该始终对变量扩展和命令替换使用双引号(在某些例外情况下,虽然没有必要,但也没有任何害处)。使用OP之类的字符串,这应该没问题,但是如果要确保printf '%s\n' "${a##* }"
会更好。
您可以使用read
内置的
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read
?不是read
进行拆分,而是进行拆分$IFS
。由于某些原因,很多人认为$IFS
只在read
涉及时才可以拆分w / 。你可以这样做: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
您要提取的子字符串之前是否总是会有空格?