合并以“+”开头的续行
Combine continuation lines starting with "+"
我知道这是一个被问过很多次的问题,但我没有找到可以回答我的具体问题的答案。
基本上,我有一个输入文件,其中一些行以 +
字符串开头。这些行必须附加在上一行的末尾,并且必须删除 +
字符。所以
abc
def
+ ghj
klm
应该变成
abc
def ghj
klm
这是我通过查看其他答案制作的 perl 命令
perl -pe 's/\n\+ //m' < input
但它打印输入文件而不更改它。奇怪的是,在像 regex101.com 这样的网站上,我的正则表达式产生了预期的结果。
我错过了什么?
大概这些是相对较小的文件,因此很容易装入内存?
这是最简单的方法
use strict;
use warnings 'all';
my $data = do {
local $/;
<DATA>;
};
$data =~ s/\n\+//g;
print $data;
__DATA__
abc
def
+ ghj
klm
产出
abc
def ghj
klm
在 Perl 单行代码中
perl -0777 -pe 's/\n\+//g' < input
您可以将输入记录分隔符 $/
更改为字符串 "\n+"
(或 "\r\n+"
用于 Windows 文件), 那么你只需要 chomp 每条记录:
perl -pe 'BEGIN{$/="\n+"}chomp' file
@Borodin 已经很好的解决了你的问题。此外,如果您需要将其更新到旧文件中,只需添加“-i”:
perl -0777 -i -pe 's/\n\+//g' input
或者如果您想保留源文件作为备份,请使用:
perl -0777 -i.bak -pe 's/\n\+//g' input
这将生成一个名为 input.bak 的文件,以备您要恢复时使用。
我知道这是一个被问过很多次的问题,但我没有找到可以回答我的具体问题的答案。
基本上,我有一个输入文件,其中一些行以 +
字符串开头。这些行必须附加在上一行的末尾,并且必须删除 +
字符。所以
abc
def
+ ghj
klm
应该变成
abc
def ghj
klm
这是我通过查看其他答案制作的 perl 命令
perl -pe 's/\n\+ //m' < input
但它打印输入文件而不更改它。奇怪的是,在像 regex101.com 这样的网站上,我的正则表达式产生了预期的结果。
我错过了什么?
大概这些是相对较小的文件,因此很容易装入内存?
这是最简单的方法
use strict;
use warnings 'all';
my $data = do {
local $/;
<DATA>;
};
$data =~ s/\n\+//g;
print $data;
__DATA__
abc
def
+ ghj
klm
产出
abc
def ghj
klm
在 Perl 单行代码中
perl -0777 -pe 's/\n\+//g' < input
您可以将输入记录分隔符 $/
更改为字符串 "\n+"
(或 "\r\n+"
用于 Windows 文件), 那么你只需要 chomp 每条记录:
perl -pe 'BEGIN{$/="\n+"}chomp' file
@Borodin 已经很好的解决了你的问题。此外,如果您需要将其更新到旧文件中,只需添加“-i”:
perl -0777 -i -pe 's/\n\+//g' input
或者如果您想保留源文件作为备份,请使用:
perl -0777 -i.bak -pe 's/\n\+//g' input
这将生成一个名为 input.bak 的文件,以备您要恢复时使用。