perl匹配连续换行符:'回显“aaa\n\n\nbbb”|perl -pe“s/\\n\\n/z/gm”'

ddhy6vgd  于 2023-01-31  发布在  Perl
关注(0)|答案(2)|浏览(233)

这是可行的:

echo "aaa\n\n\nbbb" | perl -pe "s/\\n/z/gm"

aaazzzbbbz

什么都不符合:

echo "aaa\n\n\nbbb" | perl -pe "s/\\n\\n/z/gm"

aaa

bbb

我该如何修正,使正则表达式匹配两个连续的换行符?

x8diyxa7

x8diyxa71#

换行符与\n匹配

echo "a\n\n\b" | perl -pe's/\n/z/'

这将打印azzb,不带换行符,所以下一个提示符在同一行。注意,程序一次输入一行,所以不需要/g修饰符。(这就是\n\n不匹配的原因。)/m修饰符与本例无关。
我不知道它是以什么形式使用的,但我可以想象不是用echo来提供输入,那么最好用文件中的输入或多行字符串(在这种情况下可能需要/g)来测试它。
一个例子

use warnings;
use strict;
use feature 'say';

# Test with multiline string  
my $ml_str = "a\n\nb\n";

$ml_str =~ s/\n/z/g;  #-->  azzbz (no newline at the end)
print $ml_str;    
say '';      # to terminate the line above

# Or to replace two consecutive newlines (everywhere)
$ml_str = "a\n\nb\n";   # restore the example string 
$ml_str =~ s/\n\n/z/g;  #-->  azb\n
print $ml_str;    

# To replace the consecutive newlines in a file read it into a string
my $file = join '', <DATA>;  # lines of data after __DATA__

$file =~ s/\n\n/z/g;
print $file;  

__DATA__
one
two

last

这个打印

azzbz
azb
one
twoz
last

顺便说一句,我想提一下,使用修饰符/s时,.也匹配换行符(例如,这对于匹配可能包含换行符的子字符串.*(或.+)很方便;如果没有/s修饰符,则该模式在换行符处停止。)
请参见perlrebackslash并搜索newline
/m修饰符使^$也匹配多行字符串 * 内部 * 的行首和行尾。

$multiline_string =~ s/$/z/mg;

将替换字符串中的换行符。然而,这个例子有一些复杂性,因为一些换行符保留了下来。

ws51t4hk

ws51t4hk2#

您一次只能对一行应用替换,并且一行永远不会有两个换行符。请改为对整个文件应用替换:

perl -0777 -pe 's/\n\n/z/g'

相关问题