如何在一行中间删除回车

时间:2011-05-21 11:37:03

标签: perl file special-characters

我有unix和windows中的应用程序读取的文件。但是,当我在数据中间用^ M读取窗口时遇到问题。我只想删除行中间的^ M,如字段4和字段5。

我尝试过使用perl -pe 's/\cM\cJ?//g',但它将所有内容都删除为一行,我不想要。我希望数据保持在同一行但删除额外的数据

# Comment^M
# field1_header|field2_header|field3_header|field4_header|field5_header|field6_header^M
#^M
field1|field2|field3|fie^Mld4|fiel^Md5|field6^M
^M

由于

3 个答案:

答案 0 :(得分:1)

要在一行中间删除CR:

perl -pe 's/\r(?!\n)//g'

你也可以写这个perl -pe 's/\cM(?!\cJ)//g'?!构造是negative look-ahead expression。该模式与CR匹配,但只有当它没有后跟LF时才会匹配。

当然,如果生成带有unix换行符的文件是可以接受的,则可以简单地删除所有CR字符:

perl -pe 'tr/\015//d'

你所写的,s/\cM\cJ?//g,剥离CR和后面的LF,如果有的话,因为LF是匹配模式的一部分。

答案 1 :(得分:0)

听起来最简单的解决方案可能是在unix和windows之间移动之前检查你的文件类型。 <{1}}和dos2unix可能是你真正需要的,而不是正则表达式。

我不确定应该是什么字符unix2dos,但回车是^M\015。所以,\r就足够了。记住它也会删除你最后一次回车,如果那是你想保留的话。

答案 2 :(得分:0)

use strict;
use warnings;

my $a = "field1|field2|field3|fie^Mld4|fiel^Md5|field6^M";

$a =~ s/\^M(?!$)//g;

print $a;