我可以链接多个sed替换和awk操作来实现这一点,但是有一个sed替换可以做到吗?
还有其他更适合此解析任务的工具吗?
答案 0 :(得分:2)
你可以尝试:
sed -r 's!rec:id=(.*?)&name=(.*?)&age=(.*?)!\1 \2 \3!' input_file
如果你事先不知道rec:id
等,但你知道其中有三个,你可以试试:
sed -r 's![^=]+=(.*?)&[^=]+=(.*?)&[^=]+=(.*?)!\1 \2 \3!' input_file
如果您事先不知道有多少&name=value
对,但想要输出所有值,您可以尝试以下方法:
grep -P -o '(?<==)([^&]*)(?=&|$)' | xargs
-P
表示&#39; perl regex&#39;,正则表达式说&#34;找到后跟&
(或字符串结尾)的字符串,前面带有和等于符号&#34;,-o
表示只在各自的行上打印匹配(即1,zz和21),| xargs
将这些匹配从他们自己的行移动到一行,空格分隔(即1\nzz\n21
到1 zz 21
)。
答案 1 :(得分:1)
这可能对您有用:
echo "rec:id=1&name=zz&age=21" | sed 's/[^=]*=\([^&]*\)/\1 /g'
1 zz 21
然而,这会留下额外的空间,以解决这个问题:
echo "rec:id=1&name=zz&age=21"|sed 's/[^=]*=\([^&]*\)/\1 /g:;s/ $//'
1 zz 21
答案 2 :(得分:0)
如何将值直接解析为变量?
inbound="rec:id=1&name=zz&age=21"
eval $(echo $inbound | cut -c5- | tr \& "\n")
echo "Name:$name, ID:$id, Age:$age"
甚至更好,虽然稍微有点神秘:
inbound="rec:id=1&name=zz&age=21"
IFS=\& eval $(cut -c5- <<< $inbound)
echo "Name:$name, ID:$id, Age:$age"