Perl \ R regex剥离Windows换行符

时间:2015-06-04 14:50:43

标签: regex linux windows perl newline

我使用以下代码使用Perl脚本删除输入文件中可能的Windows换行符:

foreach my $line(split /\r|\R/)

在两台不同的Linux机器上执行相同的脚本会产生不同的结果。在machine1脚本上按预期工作,每次在资本" R"找到字符行被拆分,结果混乱。

我想知道\R正则表达式是否正确以及如何使machine2按预期运行。

3 个答案:

答案 0 :(得分:6)

在Perl中,可以处理回车的方式有几点不同:

\n matches a line-feed (newline) character (ASCII 10)
\r matches a carriage return (ASCII 13)
\R matches any Unicode newline sequence; can be modified using verbs

Windows使用两个字符ASCII 13 + ASCII 10\r\n),而unix使用ASCII 10\n)。 \R表达式匹配任何Unicode换行符序列\r\n\r\n)。

\R在一台计算机上运行而不在另一台计算机上运行的可能原因可能是Perl的不同版本。 \R中引入了perl 5.10.0,因此如果其他计算机使用的是旧版本,则更新可以解决您的问题。

更多信息

答案 1 :(得分:3)

你的一台机器必须使用相当古老的Perl版本。

5.8:

$ perl -wle'print for split /\R/, "QRS\r\nTUV\r\n";'
Unrecognized escape \R passed through at -e line 1.
Q
S
TUV

5.10:

$ perl -wle'print for split /\R/, "QRS\r\nTUV\r\n";'
QRS
TUV

始终使用use strict; use warnings;

备选方案:

  • split /[\r\n]/。这相当于你正在使用的东西,但它可能是错误的。
  • split /\n|\r\n?/。这相当于split /\R/
  • split /\r?\n/。这与unix和Windows行结尾相匹配。
  • split /\r\n/。这与Windows行结尾相匹配。

我使用倒数第二个。

答案 2 :(得分:0)

我几乎每天都使用Perl。

但是,如果我要做的只是转换行结尾,那么我使用