处理带有嵌入式 UNIX 换行符的固定长度记录

Jef*_*ave 0 regex perl newline

我收到的文本文件是固定长度字段和回车/换行符分隔记录 ( CRLF)。最近,其中一个文本字段开始在记录 ( ) 中出现换行符LF。这显然在我们的 unix 服务器上造成了一些问题。

LF我想简单地在文件中查找 的使用并将其替换为单个空格,但这显然会干扰 Windows 换行符。

我已经尝试过trperl但似乎不太正确:

cat badinput.txt | perl -p -e 's/\x0D\x0A/\x0D/' | perl -p -e 's/\0A/ /' | perl -p -e 's/\x0D/\x0D\x0A/' > goodoutput.txt
Run Code Online (Sandbox Code Playgroud)

这个想法是

  • CRLF用。。。来代替CR
  • LF用。。。来代替
  • CR用。。。来代替CRLF

由于某种原因,我不太明白 CR -> CRLF 转换。

建议?

zdi*_*dim 5

当它前面没有紧接着时,为什么不替换\x0A(用空格)\x0D

s/(?<!\x0D)\x0A/ /;
Run Code Online (Sandbox Code Playgroud)

这使用负回顾

将文件读入字符串(“slurp”它)可能是最安全的,因为不清楚那些 LF/CRLF 将如何“逐行”读取它——操作系统上的“行”是什么?这是处理过的吗?所以

perl -0777 -wpE's/(?<!\x0D)\x0A/ /g' file
Run Code Online (Sandbox Code Playgroud)

命令0777 开关有效地取消设置输入记录分隔符

这将打印出包含更改的文件。要就地更改它,请添加-i. 请参阅链接的文档。