如何去掉行中间的回车符

问题描述 投票:0回答:3

我有 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
perl file special-characters
3个回答
1
投票

要删除行中间的 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 是匹配模式的一部分。


0
投票

听起来最简单的解决方案可能是在 UNIX 和 Windows 之间移动之前检查您的文件类型。

dos2unix
unix2dos
可能是您真正需要的,而不是正则表达式。

我不确定

^M
应该是什么字符,但回车符是
\015
\r
。所以,
s/\r//g
应该就足够了。请记住,如果您希望保留最后一个回车符,它还会删除您的最后一个回车符。


0
投票
use strict;
use warnings;

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

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

print $a;
© www.soinside.com 2019 - 2024. All rights reserved.