[英]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
这将仅将行尾带有回车符的行连接到下一行。
每行都以一些终止符序列结束,要么
如果某些行没问题,您应该说文件来自哪个系统或在哪个系统上执行 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.