【问题标题】:Deleting multiline text from multiple files从多个文件中删除多行文本
【发布时间】:2010-09-15 12:36:55
【问题描述】:

我有一堆 java 文件,我想从中删除带有许可证的 javadoc 行 [正在更改我的代码]。

我正在寻找的模式是

^\* \* ProjectName .* USA\.$

但跨行匹配

sed [或 Windows/Linux 中常用的编辑器] 是否可以搜索/替换多行模式?

【问题讨论】:

    标签: sed grep multiline


    【解决方案1】:

    可能有人仍在不时地寻找这样的解决方案。这是一个。

    使用 awk 查找要删除的行。然后使用 diff 删除这些行并让 sed 清理。

    awk "/^\* \* ProjectName /,/ USA\.$/" input.txt \
      | diff - input.txt \
      | sed -n -e"s/^> //p" \
      >output.txt
    

    警告说明:如果第一个模式存在而第二个不存在,您将丢失第一个模式下方的所有文本 - 因此请先检查。

    【讨论】:

    • 这看起来棒极了! .. 除了diff 是愚蠢的!如果您在文件中有 SSH2 密钥之类的模式,并且您正在尝试删除一个,请不要使用它。它将从文件顶部取一行,然后从其他地方取其余行。
    【解决方案2】:

    是的。您是否使用 sed、awk、perl 或其他工具来解决此问题?

    大多数正则表达式工具都允许您指定多行模式。请注意过于贪婪的正则表达式,否则它们会匹配 cmets 之间的代码(如果存在)。

    这是一个例子:

    /\*(?:.|[\r\n])*?\*/
    perl -0777ne 'print m!/\*(?:.|[\r\n])*?\*/!g;' <file>
    

    打印出所有运行的 cmets 一起。 (?: 符号必须是 用于非捕获括号。 / 不必逃避,因为! 分隔表达式。使用-0777 启用 slurp 模式和 -n 启用 自动阅读。

    (来自:http://ostermiller.org/findcomment.html

    【讨论】:

      【解决方案3】:

      这是我最喜欢的 sed 教程中的 appropriate reference point

      【讨论】:

        猜你喜欢
        • 2012-03-28
        • 2019-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        • 1970-01-01
        • 1970-01-01
        • 2021-11-01
        相关资源
        最近更新 更多