我有 Unix 和 Windows 中的应用程序读取的文件。但是,当我在 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
要删除行中间的 CR:
perl -pe 's/\r(?!\n)//g'
你也可以这样写
perl -pe 's/\cM(?!\cJ)//g'
。 ?!
构造是一个 负前瞻表达式。该模式匹配 CR,但仅当它后面没有 LF 时。
当然,如果生成带有 unix 换行符的文件是可以接受的,您可以简单地删除所有 CR 字符:
perl -pe 'tr/\015//d'
你写的,
s/\cM\cJ?//g
,去掉了 CR 和后面的 LF(如果有的话),因为 LF 是匹配模式的一部分。
听起来最简单的解决方案可能是在 UNIX 和 Windows 之间移动之前检查您的文件类型。
dos2unix
和 unix2dos
可能是您真正需要的,而不是正则表达式。
我不确定
^M
应该是什么字符,但回车符是 \015
或 \r
。所以,s/\r//g
应该就足够了。请记住,如果您希望保留最后一个回车符,它还会删除您的最后一个回车符。
use strict;
use warnings;
my $a = "field1|field2|field3|fie^Mld4|fiel^Md5|field6^M";
$a =~ s/\^M(?!$)//g;
print $a;