Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如何删除具有特定图案的线条和下一行_Unix_Sed_Grep - Fatal编程技术网

Unix 如何删除具有特定图案的线条和下一行

Unix 如何删除具有特定图案的线条和下一行,unix,sed,grep,Unix,Sed,Grep,我是Unix新手,目前有一个包含各种数据的大文件。在这个文件中,有些行现在是多余的,需要删除 在文件中,模式为: <contact contact_id="<number>" txn="D"> </contact> 请帮我找到一个新的解决方案。使用awk 差不多 /<contact contact_id=.* txn="D">/ { got_contact = 1; next } got_contact == 1 { got_contact =

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

在文件中,模式为:

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

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

使用awk

差不多

/<contact contact_id=.* txn="D">/ { got_contact = 1; next }
got_contact == 1 { got_contact = 0; next }
{ print }
/{got_contact=1;next}
got_contact==1{got_contact=0;next}
{print}
即使是古代的awk也应该能够处理这个问题。(可能会有更紧凑的解决方案,但这不是code golf)

使用awk

差不多

/<contact contact_id=.* txn="D">/ { got_contact = 1; next }
got_contact == 1 { got_contact = 0; next }
{ print }
/{got_contact=1;next}
got_contact==1{got_contact=0;next}
{print}

即使是古代的awk也应该能够处理这个问题。(可能有一个更紧凑的解决方案,但这不是code golf)

您可以使用
GNU-sed

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

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

tr '\n' '\r' < your_file |
   sed 's#<contact contact_id=[^ ]* txn="D">\r</contact>\r##g;
       s#\r#\n#g'
tr'\n'\r'<您的\u文件|
塞德的#\r\r##g;
s\r\n\g'

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

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

tr '\n' '\r' < your_file |
   sed 's#<contact contact_id=[^ ]* txn="D">\r</contact>\r##g;
       s#\r#\n#g'
tr'\n'\r'<您的\u文件|
塞德的#\r\r##g;
s\r\n\g'

你能在你的操作系统上安装程序/软件包吗?不幸的是,我只能使用SunOS 5.10的基本版本,不知道你使用
sed-e'
是什么意思(例如,我假设你指的是
sed-e'3,+1d'文件)。如果您使用的是一个变量,那么您需要
sed-e“$lineNum,+1d”文件
,但我希望一个范围匹配可以工作,因此
sed'/[]/,+1d”文件
应该可以工作。请注意,
-e
并不是每个人都需要的。与其说“不受支持”,不如说包含正在运行的确切代码示例的副本/粘贴,并显示错误消息
sed
相当精细,而且
3、+1d
用于我工作过的Sun 3机器;-)感谢您的反馈,我现在已经更新了它,当运行命令
sed-e'12442,+1d'file.out>output.out
时,它给出的消息是
sed:command-garbled:12442,+1d
,您能在操作系统上安装程序/软件包吗?不幸的是,我被锁定在SunOS 5.10的基本版本中,不确定您对
sed-e'
的意思(例如,我假设您指的是
sed-e'3,+1d'文件)。如果您使用的是一个变量,那么您需要
sed-e“$lineNum,+1d”文件
,但我希望一个范围匹配可以工作,因此
sed'/[]/,+1d”文件
应该可以工作。请注意,
-e
并不是每个人都需要的。与其说“不受支持”,不如说包含正在运行的确切代码示例的副本/粘贴,并显示错误消息
sed
相当精细,而且
3、+1d
用于我工作过的Sun 3机器;-)感谢您提供的反馈,我现在已经更新了它,它给出的消息是
sed:command-garbled:12442,+1d
当运行命令
sed-e'12442,+1d'file.out>output.out
测试该代码后,该解决方案似乎不起作用。出现了什么问题?标签是混合的吗?哦,我错过了添加类似的行。您必须扩展模式以保持这些相似的线条。像
/
你试过
awk'。。。单引号内罗纳德的代码…'orgfile>newfile
diff-orgfile-newfile
?谢谢!我的愚蠢应该已经注意到,它不会与
*
一起工作,需要
txn=“D”
才能工作。这已经像一个魅力,再次感谢!在测试代码之后,这个解决方案似乎不起作用。出了什么问题?标签是混合的吗?哦,我错过了添加类似的行。您必须扩展模式以保持这些相似的线条。像
/
你试过
awk'。。。单引号内罗纳德的代码…'orgfile>newfile
diff-orgfile-newfile
?谢谢!我的愚蠢应该已经注意到,它不会与
*
一起工作,需要
txn=“D”
才能工作。这已经像一个魅力,再次感谢!