【发布时间】:2017-05-06 10:50:56
【问题描述】:
我很抱歉,因为这是一个菜鸟// 问题,但我对跨不同应用程序/工具的操作不一致感到沮丧。我对差异了解不够。我已经研究并查看了以下链接的主题,并且已经将我的头撞到墙上好几个小时了。
Perl - remove carriage return and append next line
问题是我正在清理数据(嘘),我相信我已经找到了一个通用解决方案,可以将 7+ s// 操作减少到一个。但是当它在 notepad++ 和这个在线工具 regex101.com 中工作时,我无法通过命令行进行操作。
这是一些类似的数据:
1429,12/6/2016,11:07:24 AM,T,527:472,281,2,176,-,205,Error,[CR][LF]
[CR][LF]
anchorstring::anchorstring2 message payload[CR][LF]
important data here =999, source=001, xyz=687[CR][LF]
1430,12/6/2016,11:07:24 AM,T,527:472,281,11,1844,-,81,Message,writing data[CR][LF]
我添加了 [CR][LF] 因为使用 notepad++ 我可以看到它们。我无法通过命令行 perl 表达式摆脱它们。
很明显,不以数字开头的三行是坏行,需要拉回到第 1429 行。
我试过了:
perl -p0e "s/(\cM\cJ)?\cM\cJ(^[^\d].+)/\2 /g" output.csv > output2.csv
perl -p0e "s/(\r\n)?\r\n(^[^\d].+)/\2 /g" output.csv > output2.csv
sed -r s/"\r\n(^[^\d].+)"/"\1 "/g output.csv > output2.csv
perl -p0e "s/\n(^[^\d]+.+)/\1 /g" output.csv > output2.csv
令人作呕……
令人沮丧的是,当我在 notepad++ 中使用正则表达式 find&replace 运算符时它可以工作,而 regex101 工具说它应该找到并替换它。
perl -p00e "s/(,Error,)\n\n/\1/g" output.csv > output2.csv 努力摆脱 CRLF,但它锚定到“错误”并且并非所有拆分都有。
任何帮助将不胜感激。
谢谢。
【问题讨论】:
-
你可以用它来移除 CR & LF
$_ =~ s/\x{0A}//g; # remove line feed$_ =~ s/\x{0D}//g; # remove carriage return -
你没有问问题 :-) 你想用单个 CRLF 替换连续的 CRLF 吗?还是您正在尝试做一些更复杂的事情?
-
我....没有问任何问题。我的错。我想我的问题是我怎么知道什么时候使用哪种语法?如果我无法确定哪种语法,我可以从中“向前”工作的最简单的表达式是什么?