【问题标题】:Perl multiline search replacePerl 多行搜索替换
【发布时间】:2015-08-24 23:11:55
【问题描述】:

我想使用 perl one-liner 找到相应的块并取消注释文本文件中的第二行。我对使用复杂的正则表达式相当陌生,因此非常感谢您的帮助!还有一种方法可以调试单行吗?

这是我目前所拥有的,即使我使用交互式正则表达式测试器对其进行了测试,它也不起作用:

perl -p -i.bak -e 's/#[\s]*label2[\n]#(.*)/${1}/gi;' file.txt

文本文件如下所示

#   label1
#variable=foobar1

#   label2
#variable=foobar2

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    一个选项:

    perl -0777 -pe 's/(#\s*label2\s*\n)#/$1/s' infile
    

    -0777 吞下整个文件,括号对关键行进行分组以在替换部分再次使用它,并删除它之外的内容,# 字符。它产生:

    #   label1
    #variable=foobar1
    
    #   label2
    variable=foobar2
    

    关于调试,我认为它的工作原理与从脚本相同,使用-d 开关来激活它。只需将每条指令放在不同的行中即可很好地可视化它。

    【讨论】:

    • /s 修饰符改变了. 的行为方式,但您的正则表达式中没有.
    • 顺便说一句,我在哪里可以获得有关 -0777 标志的一些文档/信息?
    • @user1940015 运行perldoc perlrun(我已经链接到在线版本,以防你的机器上没有perldoc)。
    • @ThisSuitIsBlackNot 谢谢!
    【解决方案2】:

    一个 awk 解决方案,如果您不限于 perl:

    awk 'f{f=sub(/^#/,"")};/label2/{f=1}1' file.txt
    

    【讨论】:

    • 谢谢,但我的情况仅限于使用 perl
    猜你喜欢
    • 2010-11-05
    • 2021-01-31
    • 2015-02-20
    • 1970-01-01
    • 2013-05-20
    • 2018-05-26
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多