我有一个像
这样的字符串 a=b c=d e=f g=h i=j j=k
如何解析此字符串以获取j
的值?
答案 0 :(得分:1)
无论j=
的列数如何,这将打印任何后跟j
的内容,直到即将到来的空格。
echo "a=b c=d e=f g=h i=j j=k" |grep -oP 'j=\K[^ ]+'
k
如果您的意思是,最后一列的值,在本例中为j=k
:
echo "a=b c=d e=f g=h i=j j=k" |awk '{split($NF,a,"=");print a[2]}'
k
注意:解决方案1基于regex
表示j的值,而解决方案2表示最后一列的值。由您决定哪一个更符合您的要求。
或使用awk的gensub
:
echo "a=b c=d e=f g=h i=j j=k" |awk '{J=gensub(/.*j=([^ ]+).*/,"\\1","g");print J}'
k
或使用gawk
匹配功能:
echo "a=b c=d e=f g=h i=j j=k" |awk '{match($0,/.*j=([^ ]+).*/,a);print a[1]}'
k
或使用sed
回复:
echo "a=b c=d e=f g=h i=j j=k"|sed -r 's/.*j=([^ ]+).*/\1/'
k
答案 1 :(得分:0)
在bash中有很多方法可以做到这一点。更好的取决于字符串模式。
假设模式总是key=value_without_whitespace key2=value2 ...
,那么可能是:
echo "a=b c=d e=f g=h i=j j=k" | grep -P -o 'j=([^ ])' | cut -d '=' -f 2
答案 2 :(得分:0)
使用awk:
awk '{ for (i=1;i<=NF;i++) { split($i,arr,"=");if (arr[1]=="j") { print arr[2] } } }' <<< "a=b c=d e=f g=h i=j j=k"
查看每个空格分隔的字段,然后进一步将字段拆分为在=上分隔的数组(arr)。如果数组的第一个下标是j,则打印第二个下标。
答案 3 :(得分:0)
使用source
。将分号分隔的字符串作为文件描述符传递
source <(echo "a=b c=d e=f g=h i=j j=k" | tr ' ' ';')
echo $j
k