我是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
请帮我解决一个新的解决方案。
答案 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'