【问题标题】:Delete lines before and after a match within a specified tags in SED删除 SED 中指定标签内匹配前后的行
【发布时间】:2014-03-17 10:57:19
【问题描述】:

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

< 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 标记内的所有内容...任何指针都会有所帮助。

【问题讨论】:

  • mds:insert 块可以嵌套吗?
  • 你有 gnu grep 吗?用 grep -A, -B -C 可以轻松控制
  • mds:insert 块不是嵌套的..

标签: regex bash sed


【解决方案1】:

这是在 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

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

【讨论】:

  • 您可以尝试双引号而不是单引号。你用的是什么外壳?
  • 这也会删除&lt; mds:insert&gt; 标签。 OP喜欢删除&lt; mds:insert&gt;标签中的数据而不是标签。
  • @Jotne:问题的措辞不清楚,但您可能是对的。如果 OP 确认,我将编辑我的答案——这很容易解决。
  • @Jotne & Beta.. 很抱歉,您也需要删除 标签。
【解决方案2】:

这是一种使用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 之前的两行和之后的两行。

【讨论】:

    【解决方案3】:

    不是sed,但这是ex 的一个,使用您发布的sn-p 作为$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 用户,所以可能有更好的方法,但我不知道。

    【讨论】:

    • 在使用上述命令时获得不明确的输入重定向。
    猜你喜欢
    • 1970-01-01
    • 2019-02-19
    • 2012-08-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 2018-09-13
    相关资源
    最近更新 更多