Perl - 删除回车并附加下一行

时间:2010-07-09 16:56:48

标签: perl

如果我在一个包含回车符的好文件中有记录怎么办。

例如:

1,2,3,4,5 ^M
,6,7,8,9,10

我想成功

1,2,3,4,5,6,7,8,9,10

6 个答案:

答案 0 :(得分:1)

一般情况下,如果你想要摆脱一个带有迷你换行符的字符串,你可以在它上面使用chomp(注意你可以将它传递给左值,所以将它包裹起来作业合法):

my $string = $string2 = "blah\n";
chomp $string;

# this works too:
chomp(my $string3 = $string2);

请注意,如果字符串的结尾为"\r\n",则chomp也不会使用\r,除非您修改$/

因此,如果所有这些都过于复杂,您需要删除所有\n\r\n\r(可能您正在处理来自各种体系结构的行)马上,你可以回到原来的tr

$string =~ tr/\r\n//d;

答案 1 :(得分:1)

假设我们有一个包含ctrl-M的文件(在某些平台上也称为\r):

$ cat input 
1,2,3
4,5,6
,7,8,9
10,11,12

od

这是明确的
$ od -c input 
0000000   1   ,   2   ,   3  \n   4   ,   5   ,   6  \r  \n   ,   7   ,
0000020   8   ,   9  \n   1   0   ,   1   1   ,   1   2  \n
0000035

删除每个违规字符,然后通过运行

将其与下一行连接
$ perl -pe 's/\cM\cJ?//g' input 
1,2,3
4,5,6,7,8,9
10,11,12

或使用

重定向到新文件
$ perl -pe 's/\cM\cJ?//g' input >updated-input

或使用

覆盖它(加上input.bak中的备份)
$ perl -i.bak -pe 's/\cM\cJ?//g' input

当文件以ctrl-M而不是ctrl-J结尾时,使\cJ可选句柄处理。

答案 2 :(得分:0)

S / [\ r \ n]的//克

只有在想要将一条线与下一条线组合时才执行此操作。

答案 3 :(得分:0)

假设回车位于换行前:

perl -pi.bak -e 's/\r\n//' your_file_name

这只会在行尾添加一个回车符到下一行。

答案 4 :(得分:0)

每一行都以一些终结符序列结束,

  • Windows / DOS上的CRLF(\ r \ n = 13,10)
  • Unix上的CR(\ n = 10)
  • MacOS上的LF(\ r = 13)

如果某些行是正常的,你应该从wich系统说文件出现或者在系统上执行perl脚本,或者风险是删除每一行并合并所有程序行......

因为^ M是LF字符,如果你在一行的末尾看到这样的字符并且在其他行上没有什么特别的东西,你可能正在使用某种Unix(Linux?)并且一些复制/粘贴已经污染了一个在行尾添加\ r \ n的行。

如果是这种情况:

perl -pi -e 's/\r\n$//g' filetomodify

将执行该技巧,并仅将包含CR和LF的行与下一行合并,而不将其他行合并。

答案 5 :(得分:-1)

需要更多信息


需要有关基础数据的更多信息以及您对carriage return的定义。是Linux或Windows中的数据?真的,你的意思是回车/换行,还是换行?


一些选项:

  • $text =~ tr/\r//;→这是清除回车的最快方法
  • $text =~ tr/\n//;→这是更改换行符的最快方法
  • $test =~ s/\n//s;→这可能就是您要查找的内容,这会使文字显示为一行并删除内部\n