尝试替换\ r \ n \ n但不替换文件中的\ r \ n

时间:2014-11-06 23:27:43

标签: regex perl awk sed

这是使用GNU sed版本4.2.1,但到目前为止我还尝试过awk和Perl没有任何成功。

我有一个由COBOL程序(在Linux上)生成的文件,它有可以被认为是非标准的CRLF而不是LF(CRLF当然是Windows行终止符),但这是我需要保留的 - 任何CRLF保留

所以\r\n序列停留。

我需要替换的是偶然的\r\n\n序列\r\n\r\n而不会打扰其他任何内容。

我必须将我使用diff生成的文件与BSD或SCO上生成的原始文件相匹配。

这不起作用,我希望第一个/nSed剥离为行终止符

sed -e 's/\r\n\n/\r\n\r\n/g'  infile  > outfile

我尝试了hex 0x并且也是双重逃避

感谢您的任何建议

5 个答案:

答案 0 :(得分:2)

我建议您在任何前面没有一个LF之前添加一个CR。

s/ (?<!\r) (?=\n) /\r/xg

在改变文件中数据的程序中,它看起来像这样

use strict;
use warnings;

use open IO => ':raw';

my $data = do {
  local $/;
  <>;
};

$data =~ s/ (?<!\r) (?=\n) /\r/xg;

print $data;

你会像

一样运行它
perl add_cr.pl myfile > newfile

或者,如果您想要就地修改文件(在测试之后),您只需使用

perl -i add_cr.pl myfile

答案 1 :(得分:2)

作为面向行的工具,blah\r\n\n将是一行blah\r,后面跟一个空行。因此,将\r添加到任何空行:

sed 's/^$/\r/' infile > outfile

答案 2 :(得分:0)

只需使用这个Perl one-liner:

perl -pe "s/\R/\r\n/g" <input.txt >output.txt

此处的Magic大约是\R,它与Perl接受的任何新行组合相匹配:\n\r\n\r。据我所知,\R仅限Perl - sedawk不支持。

答案 3 :(得分:0)

用于多字符RS的GNU awk:

awk -v RS='\r\n\n' -v ORS='\r\n\r\n' '1' file

答案 4 :(得分:0)

尝试unix2dos实用程序:它处理所有unix / dos /和unix / dos情况的混合。 注意:dos2unix也是一个很好的实用程序。

覆盖:

unix2dos your-file

创建新文件:

unix2dos < your-file > your-new-file