如何删除具有特定模式和下一行的行

时间:2017-08-17 12:48:41

标签: unix sed grep

我是Unix的新手,目前我有大量的各种数据文件。在这个文件中,有些行现在是多余的,需要删除。

在文件格式中:

<contact contact_id="<number>" txn="D">
</contact>

编辑:还有与要删除的行类似的行,例如:

<contact contact_id="<number>" txn="N">
</contact>

我试图使用grep -A 1来获取模式并删除下一行但是我在旧版本的Solaris上运行并且-A是非法表达。

除此之外,我试图使用sed -e '12442,+1d',这只是给出了

的输出
sed: command garbled: 12442,+1d

请帮我解决一个新的解决方案。

2 个答案:

答案 0 :(得分:1)

使用awk?

类似

/<contact contact_id=.* txn="D">/ { got_contact = 1; next }
got_contact == 1 { got_contact = 0; next }
{ print }
甚至古代的awk应该能够处理这个问题。 (可能有一个更紧凑的解决方案,但这不是代码高尔夫)

答案 1 :(得分:1)

您可以使用GNU sed吗? 对于那些想要编写可移植sed脚本的人,请注意已知某些实现限制行长度(对于模式和保持空间)不超过4000个字节。 POSIX标准规定符合标准的sed实现应支持至少8192字节的行长度。 GNU sed没有内置的线路长度限制;只要它可以使用malloc()更多(虚拟)内存,只要你愿意,你就可以提供或构建行。

下一个解决方案开始将文件转换为一个长行:

tr '\n' '\r' < your_file |
   sed 's#<contact contact_id=[^ ]* txn="D">\r</contact>\r##g;
       s#\r#\n#g'