Unix文件处理如何删除垃圾字符

3

输入文件:

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]字符出现。

1
控制-M(CR)后面跟着换行符(LF)吗?看起来是这样的。所以,您希望以换行符(而不是CR + LF)终止的行将换行符替换为空格,并且以CR LF结尾的行将以仅LF结尾。是这样吗?如果是这样,那很遗憾,您不能使用tr(它会在CR LF结束后向行添加前导空格)。 - Jonathan Leffler
是的!我尝试了tr命令,但它添加了前导空格。不过你的回答还是很好的!我的数据中没有前导空格,所以我可以用'' {null}来省略第一个空格字符!! - Shaan
2个回答

2

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

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

要替换^M,可以使用\r\015(第15个ASCII字符在八进制中是13)。


2

使用 gnu-awk,您可以执行以下操作:

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

abc def
ghi jkl mno
pqr

抱歉,但它输出的所有文件都在同一行! - Shaan
我已经在我的回答中展示了我得到的输出。你能在你的问题中输出 cat -vte file 的结果吗? - anubhava
好的,当我在Cygwin中尝试时它没有工作,但在Unix中很好!非常感谢! - Shaan
2
在Cygwin上,您需要防止低级C原语在awk脚本处理之前剥离控制-M。为了防止这种情况发生,您需要将gawk置于二进制模式下:awk -v BINMODE=3 -v RS='\r\n*' '{gsub(/\n/, " ")} 1' file。如果您关心的话,请参见http://www.gnu.org/software/gawk/manual/gawk.html#PC-Using获取详细信息。 - Ed Morton
1
谢谢@EdMorton。我不知道Cygwin awk的这种异常情况。 - anubhava
1
我喜欢把它看作是Windows的另一个异常问题 :-). 它不仅影响cygwin和/或awk,也会影响其他在Windows上运行的平台/工具。 - Ed Morton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接