删除SED中指定标记内匹配前后的行

  • 本文关键字:SED 删除 regex bash sed
  • 更新时间 :
  • 英文 :


需要删除标签中匹配模式的前后

< mds:insert> 
< attributeValues>
< AttrNames
< Item Value="MyContact_c"/>
< /AttrNames>
< /attributeValues>
< /mds:insert>

使用

sed -i -n '/MyContact_c/{s/.*//;x;d;};x;p;${x;p;}' $file

只删除匹配模式前后的行,需要删除mds:insert标记中的所有内容。。。任何指针都会有所帮助。

它不是sed,但这里是ex的一个,使用您发布的片段作为$file:的文件内容

kitsune:~$ printf '%sn' 'set ic
1;/="MyContact_c"/<|?<mds:insert?+;/</mds:insert>/-d
%p' | ex -s $file

输出:

<mds:insert>
</mds:insert>

这将在删除节的第一个实例后打印文件的剩余部分。如果您希望对所有实例都这样做,命令行将如下所示:

'set ic
g/="MyContact_c"/<|?<mds:insert?+;/</mds:insert>/-d
%p'

如果希望对多个文件执行此操作,可以在shell脚本的for循环中使用此操作。如果你做这样的事情,你自然会想要一个备份副本,所以如果你打算覆盖它,请确保在更改之前复制文件

顺便说一句,如果你曾经使用过Vim甚至vi,这些命令用于保存、退出等。值得将ex添加到你的知识工具箱IMHO中。

编辑

C Shell用户不能按原样使用这些命令,因为它们包含带引号的换行符,这在C Shell中是不允许的。相反,您可以这样修改第一个命令:

kitsune:~% printf '%sn%sn%sn' 'set ic' '1;/="MyContact_c"/<|?<mds:insert?+;/</mds:insert>/-d' '%p' | ex -s $file

您可以对其他字符串执行类似的操作。

免责声明:我自己不是一个C shell用户,所以可能有更好的方法,但我不知道。

以下是使用awk的方法

awk '{a[NR]=$0} /MyContact_b/ {f=NR} END {for (i=1;i<=NR;i++) if (i+2<f || i-2>f || !f) print a[i]}' file
< mds:insert>
< /mds:insert>

如果找到,则跳过pattern之前的两行和之后的两行。

在sed中有一种方法:

sed -e ':a' -e '/ mds:insert/!{p;d;}' -e 'N;//mds:insert/{/MyContact_c/!p;d;};ba' filename

编辑:

你和我可能正在使用不同版本的sed或其他什么。让我们尝试一个实验:

sed -e '/ mds:insert/!{p;d;}' filename

它不会做任何非常有趣的事情,但我想知道它是否会产生错误。

相关内容

  • 没有找到相关文章

最新更新