[英]Perl match newline in `-0` mode
假设我有一个像这样的文件:
I've got a loverly bunch of coconut trees.
Newlines!
Bahahaha
Newlines!
the end.
我想替换出现的“换行符”! 用(例如)NEWLINES!空行包围。 因此,理想的输出是:
I've got a loverly bunch of coconut trees.
NEWLINES!
Bahahaha
Newlines!
the end.
忽略“被换行符包围”,我可以这样做:
perl -p -e 's@Newlines!@NEWLINES!@g' input.txt
它将替换所有出现的“换行符”! 与“ NEWLINES!”。
现在,我尝试仅选择“换行符”! 被\\ n包围:
perl -p -e 's@\nNewlines!\n@\nNEWLINES!\n@g' input.txt
不走运(请注意-我不需要s
开关,因为我没有使用.
,我不需要m
开关是因为我没有使用^
和$
;无论如何,添加它们都无法完成这项工作) 。 先行/后退也不起作用:
perl -p -e 's@(?<=\n)Newlines!(?=\n)@NEWLINES!@g' input.txt
经过一些搜索,我发现perl
逐行读取文件(很有意义; sed
也是如此)。 因此,我使用-0
开关:
perl -0p -e 's@(?<=\n)Newlines!(?=\n)@NEWLINES!@g' input.txt
当然这是行不通的-0
用空字符替换换行字符。
所以我的问题是-我该如何匹配这种模式(我不希望在regex的“ s @ pattern @ replacement @ flags”结构之外写任何Perl)?
是否可以匹配该空字符? 我确实尝试过:
perl -0p -e 's@(?<=\0)Newlines!(?=\0)@NEWLINES!@g' input.txt
没有任何作用。
谁能告诉我如何在perl中匹配换行符? 是否处于-0
模式? 还是应该使用awk
东西? (我从sed
开始,但是即使使用-r
它似乎也没有超前/落后的支持。我去了perl,因为我对awk一点都不熟悉)。
干杯。
(PS: 这个问题不是我要的,因为他们的问题与.+
匹配的换行有关)。
以下应该为您工作:
perl -0pe 's@(?<=\n\n)Newlines!(?=\n\n)@NEWLINES!@g'
如果文件足够小以至于一次都被存入内存:
perl -0777 -pe 's/\n\nNewlines!(?=\n\n)/\n\nNEWLINES!/g'
否则,保留最后三行的缓冲区读取:
perl -ne 'push @buffer, $_; $buffer[1] = "NEWLINES!\n" if @buffer == 3 && ' \
-e 'join("", @buffer) eq "\nNewlines!\n\n"; ' \
-e 'print shift @buffer if @buffer == 3; END { print @buffer }'
我认为他们处理事情的方式导致您以无效的方式组合可能的解决方案。
如果使用内联编辑标记,则可以这样进行:
perl -0p -i.bk -e 's/\n\nNewlines!\n\n/\n\nNEWLINES!\n\n/g' input.txt
我将\\ n值加倍,以确保仅得到上下一行为空的行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.