【问题标题】:Unix file handling removal of Junk charsUnix 文件处理删除垃圾字符
【发布时间】:2016-08-16 11:58:07
【问题描述】:

输入文件:

abc
def^M
ghi
jkl
mno^M
pqr^M

期望的输出:

abc def
ghi jkl mno
pqr

我试过了:

sed 's/^[\^M]$/ /g' file.txt > output.txt

即。在 ^M [ctrl -m] 字符之前,所有行都应以空格分隔。

【问题讨论】:

  • 是 control-M (CR) 后跟换行符 (LF) 吗?它看起来像。因此,您希望仅以换行符(而不是 CR + LF)结尾的行用空格替换换行符,并且以 CR LF 结尾的行仅以 LF 结尾。那是对的吗?如果是这样,很遗憾,但您不能使用tr(它会在 CR LF 结尾后的行中添加前导空格)。
  • 是的!我尝试了 tr 并添加了前导空格。但是您的回答仍然很好!我在数据中没有领先空间!所以我可以用 '' {null} !! 省略第一个空格字符

标签: regex perl unix awk sed


【解决方案1】:

使用gnu-awk 你可以做到:

awk -v RS='\r\n*' '{gsub(/\n/, " ")} 1' file

abc def
ghi jkl mno
pqr

【讨论】:

  • 很抱歉,它在一行中给出了所有文件的输出!
  • 我已经展示了我在回答中得到的输出。你能在你的问题中输出cat -vte file 吗?
  • 在 cygwin 上,您需要在 awk 脚本看到它们之前阻止低级 C 原语剥离 control-M。要阻止这种情况发生,您需要将 gawk 置于二进制模式:awk -v BINMODE=3 -v RS='\r\n*' '{gsub(/\n/, " ")} 1' file。如果您关心,请参阅gnu.org/software/gawk/manual/gawk.html#PC-Using 了解详细信息。
  • 谢谢@EdMorton。我不知道 cygwin awk 的这个异常
  • 我喜欢将其视为 Windows 的又一个异常现象 :-)。它不仅会影响 cygwin 和/或 awk,还会影响在 Windows 上运行的其他平台/工具。
【解决方案2】:

^M 通常不是实际字符 ^M^ 表示特殊字符,M 表示它是第 13 个 ASCII 字符(M 是第 13 个字母)。 ^M 表示回车符。查看ASCII table 会有所帮助。这种不可打印的 ASCII 字符被称为“控制字符”。

这通常意味着文件有两个字符的 Windows 样式换行符,ASCII 13 和 ASCII 10。大多数语言将其表示为 \r\n

要替换 ^M,您可以使用 \r\015(第 15 个 ASCII 字符 以 8 为基数,即十进制的 13)。

【讨论】:

    猜你喜欢
    • 2017-06-01
    • 2017-08-04
    • 2022-07-21
    • 2016-03-28
    • 2019-04-11
    • 2012-07-22
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多