regex - 删除 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 '%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/

相关文章:

Python 正则表达式计算句子中多个匹配字符串的数量

regex - 检索文件名的一部分

java - 带有 "-"符号的指定数字格式的正则表达式

bash 用于进行数值比较和文件存在

linux - Redhat Linux - 更改目录颜色

regex - 奇怪的 sed 行为

ruby - [\s\S]* 有什么区别?和 。*?

git - 是否可以接受用户输入作为远程 git post-receive Hook 的一部分?

Sed 命令查找所有单词都以大写字母开头的行

unix - grep 使用上下文反转搜索