使用或在多线sed替换

时间:2010-05-13 10:35:46

标签: parsing shell sed multiline

我对sed的一个看似简单的部分感到困惑 - 或者声明。我编写了以下sed,它解析了一个事件文件,其中包含事件标记之间封装的多个事件,然后分别在每行打印每个事件的输出:

machinename:~$ sed -n "/<event/,/<\/event>/ {/<result/{s/.*result value=\" \(.*\)\"\/>.*/\1/g; p}; /<sender/ {s/.*phoneNo=\"\(.*\)\" country.*/\1/g; p}}" xmlEventLog_2010-02-05T16:40:55.xml | sed '/Allowed/{N;s/\n/ /;}'
Allowed +989350000100
Allowed +989350000209
Allowed +989350000002
Allowed +989350000002
Allowed +989350000100
Allowed +989350000209
Allowed +989350000002
Allowed +989350000002
machinename:~$

从上面可以看出日志中有8个事件,结果是Allowed。现在麻烦的是可能有多个结果值。结果值可以是“阻止修改”或“允许”。我认为第二个sed中的(Blocked | Modified | Allowed)会处理这个但是我得到了以下输出:

machinename:~$ sed -n "/<event/,/<\/event>/{/<result/{s/.*result value=\"\(.*\)\"\/>.*/\1/g; p}; /<sender/ {s/.*phoneNo=\"\(.*\)\" country.*/\1/g; p}}" xmlEventLog_2010-02-05T16:40:55.xml | sed '/(Allowed|Blocked|Modified)/{N;s/\n/ /;}'
Allowed
+989350000100
Allowed
+989350000209
Allowed
+989350000002
Allowed
+989350000002
Allowed
+989350000100
Allowed
+989350000209
Allowed
+989350000002
Allowed
+989350000002
machinename:~$

那我错过了什么?为什么最终的sed会停止更换换行?

提前致谢

A

2 个答案:

答案 0 :(得分:2)

你想写

sed '/\(Allowed\|Blocked\|Modified\)/{N;s/\n/ /;}'

:)

答案 1 :(得分:0)

以防万一,此次多线sed搜索已成功停止http://www.grymoire.com/Unix/Sed.html。 :)