【问题标题】:Perl: Multiline match + Adding prefix to all matched linesPerl:多行匹配+为所有匹配的行添加前缀
【发布时间】:2016-03-15 18:53:21
【问题描述】:

我是 Perl 初学者。我通常使用“sed”进行模式替换,但是由于我需要在一个大文件中注释掉一些多行部分,所以我认为使用 Perl 在多行搜索中更强大。

模式示例:

word1 {
    do not care1
    do not care2
    ...
} word2

预期输出:

#word1 {
#    do not care1
#    do not care2
#    ...
#} word2

我发现关于 perl 多行匹配的非常有用的问答,但我找不到任何好的/紧凑/简单的解决方案来为所有匹配的行(不仅仅是第一行)添加前缀。

现在,这是我写的代码:

perl -0777 -pe 's/(word1\s*{[^}]*\s*}\s*word2\s.*)/#$1/gm' 

但不幸的是,它不能为所有匹配的行添加前缀(#),如下所示:

#word1 {
    do not care1
    do not care2
    ...
} word2

你能帮忙吗?我希望代码仍然在 1 行:)

【问题讨论】:

    标签: regex perl sed multiline prefix


    【解决方案1】:

    使用范围运算符:

    perl -pe 's/^/#/ if /word1\s*\{/ .. /\}\s*word2/'
    

    【讨论】:

    • 非常感谢@choroba ...我不知道范围运算符!非常有趣。
    • 我只是在应用该代码后遇到了一个问题,我在文件中添加了前缀,从没有 word2 的错误模式匹配开始,即模式匹配消除了 {} 的条件并继续搜索直到文件的结尾就像一个模式。希望你明白我的意思。
    • @Monster:那么你可以提供更好的样本数据。
    • 是的,很难在不使问题复杂化的情况下获得所有可能的条件。我已经接受了你的解决方案,但我希望你有一个解决方案来排除 word2=word3 的错误模式。再次感谢!
    • 用更好的例子重新询问是否是你想要的。这是可行的,但我们需要一些更好的边缘案例示例来提供可行的解决方案。
    【解决方案2】:

    这可能对你有用(GNU sed):

    sed '/word1/,/word2/s/^/#/' file
    

    【讨论】:

    • 谢谢@potong!我曾经使用“sed”,但是一旦它是多行的,word1 和 word2 之间的条件是必不可少的,因为 word1 和 word2 有数百个实例,我不想将 word1 从一个部分模式匹配到另一个部分的 word2。加上模式本身可以扩展到多行
    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 2018-04-21
    • 2019-08-30
    相关资源
    最近更新 更多