【问题标题】:finding split lines and removing the CRLF between them找到分割线并删除它们之间的 CRLF
【发布时间】: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 吗?还是您正在尝试做一些更复杂的事情?
  • 我....没有问任何问题。我的错。我想我的问题是我怎么知道什么时候使用哪种语法?如果我无法确定哪种语法,我可以从中“向前”工作的最简单的表达式是什么?

标签: perl replace sed


【解决方案1】:

试试这个来消除所有的分裂。

perl -p0777e "s/\n\n?([^0-9])/ \1/g" output.csv > output2.csv

【讨论】:

  • -0777 是读取整个文件的正确方法。 -0 只读取到一个 NUL。
  • 是的,没错。如果 csv 文件包含空值,它应该是 -0777 以确保读取整个文件。我已经更正了答案。谢谢。
  • 谢谢!我正在尝试实际更改 output2 文件的最小代码,到目前为止我得到的是perl -p0e "s/\n\n(.+)\n/\1 /g" output.csv > output2.csv。它不喜欢^(.+)[^\d][^0-9],这让我很惊讶。我尝试了您的选项更改,它似乎工作得很好。我必须消除几个异常值,但我相信选项变化是个大问题。只是让你知道我支持你,但我的代表很臭。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
相关资源
最近更新 更多