【问题标题】:How to replace multiple any-character (including newline) in Perl RegEx?如何在 Perl RegEx 中替换多个任意字符(包括换行符)?
【发布时间】:2016-07-31 16:55:46
【问题描述】:

这是MyTextString.txt的简化描述:

注意:BlaBla 代表任何字符,包括换行符。

START BlaBla-In END BlaBla-Out-Between START BlaBla-In END BlaBla-Out- START BlaBla-In END BlaBla-Out-Between START BlaBla-In END ...

我正在寻找删除 END 和 START (BlaBla-Out-Between) 之间的文本 以得到如下结果:

START BlaBla-In END 换行 START BlaBla-In END 换行 START BlaBla-In END 换行符 START BlaBla-In END ...

我有一个 perl 文件 changes.pl

BEGIN {
    @ARGV = map glob("\"$_\""), @ARGV;
}

s/(END).*?(START)/$1\n$2/sg; #TEST

我应该使用这个 CMD 行来执行我的替换:

perl -i.bak -p changes.pl My/File/Directory/MyTextString.txt

注意:changes.plCMD 行 与其他正则表达式查找和替换字符串一样,如 question 中所述。

但是对于这个 RegEx 字符串,MyTextString.txt 不会发生任何修改:

s/(END).*?(START)/$1\n$2/sg;

我认为关于我的正则表达式语法的一切都很好,因为它在 regex 101 tester 上运行良好。

我正在寻找使用提到的 changes.plCMD 行 匹配和替换 任何字符(包括换行符)。简单地说,我正在寻找用 newline 替换 BlaBla-Out-Between

【问题讨论】:

  • 在进行替换之前,您需要将整个文件转换成一个字符串。 -p 命令行开关一次只读取一行
  • @HåkonHægland 没错.. 需要在变量中读取整个文件

标签: regex windows perl cmd


【解决方案1】:

在进行替换之前,您需要将整个文件转换成一个字符串。 -p 命令行开关一次只读取一行。

这意味着替换 s/(END).*?(START)/$1\n$2/sg 只会在同一行上存在 END 模式后跟 START 模式的情况下删除任何内容。

要 slurp 文件,您可以指定八进制 0777 的输入记录分隔符:

perl -0777 -p -i.bak changes.pl MyTextString.txt

来自perlrun

-0[八进制/十六进制]

将输入记录分隔符 ($/) 指定为八进制或十六进制数。如果没有数字,则为空 字符是分隔符。其他开关可能先于或后于 位数。 ... 特殊值 00 将导致 Perl 在段落模式下 slurp 文件。任何值 0400 或 上面会导致 Perl 对整个文件进行 slurp,但按照惯例 值 0777 是通常用于此目的的值。

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 2014-09-30
    • 2016-07-22
    • 2011-08-08
    • 1970-01-01
    • 2022-01-08
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多