【问题标题】:multiline search and replace in perlperl中的多行搜索和替换
【发布时间】:2015-02-20 10:22:03
【问题描述】:

在使用 perl 命令替换特定字符串时我需要一些帮助,但问题是我只需要从相关标签中替换此字符串,并将其保留在所有其他标签中

我的文本文件是这样的

[我的标签] 一些价值观 和更多的价值观 my_string_To_Replace 更多的价值观 [另一个标签] 更多价值 my_string_To_Replace 我确实在下面尝试过,但此命令仅替换最后一次出现 谢谢
perl -p -i'.backup' -e 'BEGIN{undef $/;} s/(\[myTag\].*)(my_string_To_Replace)(.*)/$1NewString$3/smg' myText.file
我期待以下结果 [我的标签] 一些价值观 和更多的价值观 新字符串 更多的价值观 [另一个标签] 更多价值 my_string_To_Replace

【问题讨论】:

  • 你的预期输出是什么?
  •  [myTag] 一些值和更多值 NewString 一些更多值 [anotherTag] 更多值 my_string_To_Replace
  • 将上述内容添加到您的问题中。

标签: regex perl


【解决方案1】:

我愿意这样做,

$ perl -00pe 's/\[myTag\].*?\Kmy_string_To_Replace/NewString/gs' file
[myTag]
some values 
and more values
NewString
some more values

[anotherTag]
more values
my_string_To_Replace

\K 丢弃以前匹配的字符,-00 启用段落 slurp 模式。

【讨论】:

    【解决方案2】:

    如果您没有一个衬里也可以,这应该可以解决问题。使用记录分隔符来检测您是否在[myTag]^$ 之间,例如一个空行。

    use strict;
    use warnings;
    
    while ( <DATA> ) {
         if ( m/\[myTag\]/ .. /^$/ ) {
              s/my_string_To_Replace/some_other_text/;
         }
         print;        
    }
    
    
    __DATA__
    [myTag]
    some values 
    and more values
    my_string_To_Replace
    some more values
    
    [anotherTag]
    more values
    my_string_To_Replace
    

    如果您真的想要“单线”:

    perl -p -i.bak -ne " if ( m/\[myTag\]/ .. /^$/ ) { s/my_string_To_Replace/some_other_text/; } " file.txt
    

    【讨论】:

    • 我需要从命令行运行它而不是作为 perl 脚本 :(
    • 如果你是手动输入的,那你就错了。如果您不是手动输入,则不需要单行。但这种机制仍应内联工作。
    【解决方案3】:

    我只是做了与 Avinish Raj 建议的稍有不同

    perl -p -i'.backup' -e 'BEGIN{undef $/;} s/\[myTag\].*?\Kmy_string_To_Replace/NewString/gs' myFile
    

    【讨论】:

      猜你喜欢
      • 2021-01-31
      • 2015-08-24
      • 2018-05-26
      • 2010-11-05
      • 2019-05-05
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 2017-01-05
      相关资源
      最近更新 更多