繁体   English   中英

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

[英]Perl - remove carriage return and append next line

如果我在其他良好的文件中有一个记录,其中有回车符怎么办。

前任:

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

我想成功

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

一般来说,如果你想去掉一个在末尾有一个杂散换行符的字符串,你可以在它上面使用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;

假设我们有一个包含 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可选处理。

s/[\\r\\n]//g

仅当您想将一行与下一行合并时才执行此操作。

假设回车正好在换行之前:

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

这将仅将行尾带有回车符的行连接到下一行。

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

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

如果某些行没问题,您应该说文件来自哪个系统或在哪个系统上执行 perl 脚本,或者风险是删除行的每一端并合并所有程序行...

由于 ^M 是 CR 字符,如果您在一行的末尾看到这样的字符而其他行没有什么特别的,那么您可能正在使用某种 Unix(Linux ?),并且某些复制/粘贴已经污染了一行在行尾附加 \\r。

如果是这种情况:

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

会做的伎俩,只合并包含 CR 和 LF 的行与下一行,其他行不受影响。

需要更多信息


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


一些选项:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM