【问题标题】:Append next line in file when the current line ends with ^M当前行以 ^M 结尾时在文件中追加下一行
【发布时间】:2012-01-18 09:27:20
【问题描述】:

我有一个从工具输出的文件(从数据库查询)。其中一个字段在某些行的末尾有 ^M 个字符。这会导致我的输出损坏。当前行以 ^M 结尾时,如何将下一行附加到当前行。

我的机器安装了 sed、awk、perl、ruby 和 python,我正在使用 bash。

我使用 sed 尝试了以下操作:

sed -e :a -e '/^M$/N; s/^M\n//; ta' sourcefile > destfile

但这没有用。

请指教。

谢谢, 卡西克 S.

【问题讨论】:

  • 如果您对在 GNU sed 中需要替换或匹配哪些字符有疑问,请查看此sed -n 'l0' file的输出
  • 我想我应该以更好的方式提及文件格式。很抱歉没有早点这样做:我的文件格式为:L1F1|L1F2|L1F3|L1F4|L1F5| L2F1|L2F2|L^M 2^M F3|L2F4|L2F5|我需要它的格式:L1F1|L1F2|L1F3|L1F4|L1F5| L2F1|L2F2|L2F3|L2F4|L2F5|希望这有助于清除它。

标签: ruby perl bash sed awk


【解决方案1】:

为了了解文件每行末尾的字符,我使用了@potong cmets:

sed -n 'l0' file
>>> 1st line\r$
>>> last line\r$

我的文件在每一行都以\r$ 结尾,所以我这样做了:

sed -i "s/\r//g" file

通过就地重写文件摆脱了\r(或^M)。这是sed 的打印结果:

sed -n 'l0' file
>>> 1st line$
>>> last line$

【讨论】:

    【解决方案2】:

    我希望我正确理解了您的要求。看下面的测试:

    一个名为 test 的文件:

    abc^M
    ___2ndline
    
    
    xyz^M
    ###2ndline again
    

    注意^M 我用ctrl-v, ctrl-m 在vim 中输入了

    现在使用以下 awk 行查看输出。我希望这是您所需要的:

    kent$  awk  '/^M/{gsub(/^M/,"");printf $0;next;}1' test
    abc___2ndline
    
    
    xyz###2ndline again
    

    【讨论】:

      【解决方案3】:

      你看到的 ^M 字符可能实际上是一个回车。您应该匹配在正则表达式中使用 \r 的那些。数据可能是由使用 CRLF 作为行尾的系统(最有可能是 Windows)而不是 LF (就像大多数 *nix 系统一样)插入到数据库中。我猜它们后面已经有一个换行符,所以你可能想删除它们,而不是用换行符替换它们。

      您的系统上可能有dos2unix 命令可以为您转换这些行尾。

      您可能希望首先使用 dos2unix 确保行尾一致。之后,您可以像这样删除换行符:cat infile | dos2unix | tr -d '\n' > outfile。 如果你想要一个曾经有换行符的空间,你可以使用cat infile | dos2unix | tr '\n' ' ' > outfile

      附带说明,使用 sed 删除换行符很困难,因为 sed 编辑文件中的行,一次处理一行。

      【讨论】:

      • 我的问题不仅仅是删除 ^M 字符,它还涉及将下一行附加到当前行。
      • 我已经用一个示例更新了答案,该示例也删除了换行符。
      • 虽然这没有直接回答我的问题,但我根据这个答案尝试了 \r\n 而不是 ^M\n 。在此之前,我假设 ^M 和 \r 完全可以互换使用。只是学到了别的。谢谢。
      【解决方案4】:

      ^M 表示 ctrl+M,是一个字符,不是两个。当您进行替换时,您输入的是两个字符还是一个字符?

      一个字符:ctrl+v 然后ctrl+m(正确)

      两个字符:^ 然后 M(不正确,但可能看起来一样)

      【讨论】:

      • 我使用 Ctrl+v-Ctrl+m 方法将其作为一个字符输入。
      • 好的,在这种情况下,@Cédric 的回答可能更有帮助。以防万一,还是值得一试……
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 2014-08-03
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多