我有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
由于
答案 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;