需要删除标签内匹配模式的前后
< 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 '%s\n' '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
添加到您的知识工具箱是值得的。
编辑
C Shell 用户不能按原样使用这些命令,因为它们包含带引号的换行符,这在 C Shell 中是不允许的。相反,您可以像这样修改第一个命令:
kitsune:~% printf '%s\n%s\n%s\n' 'set ic' '1;/="MyContact_c"/<|?<mds:insert?+;/<\/mds:insert>/-d' '%p' | ex -s $file
您可以对另一个字符串进行类似的操作。
免责声明:我自己不是 C shell 用户,所以可能有更好的方法,但我不知道。
关于regex - 删除 SED 中指定标签内匹配前后的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21841065/