【问题标题】:Trying to replace \r\n\n but not \r\n in a file尝试替换文件中的 \r\n\n 但不是 \r\n
【发布时间】:2014-11-07 17:16:17
【问题描述】:

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

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

所以\r\n 序列保持不变。

我需要用\r\n\r\n 替换偶尔的\r\n\n 序列,而不会干扰其他任何东西。

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

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

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

我尝试了hex 0x,也尝试了双重转义

感谢您的任何建议

【问题讨论】:

    标签: regex perl awk sed


    【解决方案1】:

    我建议您只需在任何前面还没有 1 的 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
    

    【讨论】:

    • 非常感谢 Borodin,perl 脚本运行良好 - 欣赏它
    • 我预计您的解决方案会比s/\r?\n/\r\n/g 慢。
    • s/\r?\n/\r\n/g 在 GNU 4.2.1 sed 中不起作用 - 或者尽我所能与换页符、换行符等有关的任何事情看(以及我尝试使用它的方式)。我正在使用 sed -e 's/\r?\n/\r\n/g' file1 > file2 和 file2 与 file1 没有什么不同。虽然它可能在 perl 中工作。速度不是考虑因素。
    • @ikegami:你可以在评论之前给它们计时!但是,由于您的替代方案将 每个 有效的\r\n 替换为自身,所以我赌的是我的。
    • @Easycoder \n 仅适用于某些 sed,因此这可能是此解决方案不适合您的原因。在 sed 中获取换行符的可移植方式是反斜杠后跟文字换行符。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      只需使用这个 Perl 单行代码:

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

      这里的神奇之处在于 \R 匹配 Perl 接受的任何换行符组合:\n\r\n\r 单独。据我所知,\R 仅适用于 Perl - sedawk 不支持。

      【讨论】:

      • @Easycoder:在这里表示感谢的更好方式是简单地投票。最重要的是,你应该接受你认为最适合你的答案
      【解决方案4】:

      使用 GNU awk 进行多字符 RS:

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

      【讨论】:

        【解决方案5】:

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

        覆盖:

        unix2dos your-file
        

        创建新文件:

        unix2dos < your-file > your-new-file
        

        【讨论】:

          猜你喜欢
          • 2020-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-18
          • 1970-01-01
          • 2011-01-23
          • 2012-07-03
          • 1970-01-01
          相关资源
          最近更新 更多