如何使用sed one-liner将“rec:id = 1& name = zz& age = 21”解析为“1 zz 21”?

时间:2012-03-02 03:43:10

标签: sed

我可以链接多个sed替换和awk操作来实现这一点,但是有一个sed替换可以做到吗?

还有其他更适合此解析任务的工具吗?

3 个答案:

答案 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\n211 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"