【问题标题】:Deleting a multiline block of text between regex pattern using sed使用 sed 删除正则表达式模式之间的多行文本块
【发布时间】:2015-03-02 18:12:53
【问题描述】:

我有一个重复的文本块,需要在一个大型 xml 文件中删除。我想保留第一个块并在同一个 xml 标记中删除第二个块。例如:

<!--#if--> 
 -- several lines of text
<!--#else-->
-- several lines of the same text
<!--#endif-->

我想删除 else 和 endif 之间的第二个块,并保留 if 和 else 标签之间的 keep 块。非常感谢任何帮助 - 脚本最终会删除整个文件。

sed -i '/^<!--#else-->/ {p; :a; N; /^\<\!--\#endif--\>/!ba; s/*.\n//}; d' test.xml

【问题讨论】:

  • Obligatory link。使用 XML 解析库。
  • 预期输出是多少?举个更清楚的例子。
  • 预期输出是输出块外的所有内容以及#if 和#else 之间的文本 - 即我只想删除#else 和#endif 之间的重复文本

标签: regex bash awk sed


【解决方案1】:

我认为这应该适合你

sed '/--#else--/,/--#endif--/{//!d}' test.xml

这将删除elseendif 之间的行

如果你想删除 elseendif 也可以使用这个:

sed '/--#else--/,/--#endif--/d' test.xml

如果你在 cmets 中提到的情况,试试这个:

sed -n '/--#else--/,/--#endif--/p' test.xml

-n 默认不打印,/p 打印,/!d 删除

【讨论】:

  • 谢谢,我以为我把它弄复杂了。运行它似乎可以工作,但我怎样才能捕获它并输出到一个新文件? -i.bak 似乎不起作用,它使两个文件大小相同。
  • 该死的,它对我不起作用。如果我只是运行上面的命令-当它滚动时,您会看到该块已被删除。但是,如果我尝试输出到一个新文件或使用 -i.bak 我最终会得到两个大小完全相同的文件 - 没有任何内容被删除。我也试过 cat test.xml | sed '/--#else--/,/--#endif--/{//!d}' > new.xml 我最终得到两个大小完全相同的文件。
  • sed '/--#else--/,/--#endif--/{//!d}' 删除行不输出任何内容,使用我给的最后一个命令然后你会在终端中获取结果作为输出,然后您可以使用 &gt; 将其输出到文件
  • @user2167052 很高兴这对你有用。如果您认为您的问题已得到解决,您可以将答案标记为正确。
  • 如果你想删除#else而不是#endif怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 2012-06-01
  • 2013-04-16
  • 1970-01-01
相关资源
最近更新 更多