如何在Linux文本中删除所有特殊字符

19

vim图片 如何删除图片1中以蓝色字体显示的特殊字符,例如: ^M, ^A, ^@, ^[. 我了解到,^M 是Windows换行符,在此可以使用sed -i '/^M//g'来删除它,但这种方法不适用于其他字符。命令dos2unix也无法删除它们。是否有其他方法可供使用以彻底删除这些字符呢?

4个回答

35

使用 sed 命令,删除除可打印字符(字符类 [:print:])以外的所有内容:

sed $'s/[^[:print:]\t]//g' file.txt

[:print:] 包括以下内容:

  • [:alnum:](字母数字)
  • [:punct:](标点符号)
  • 空格

ANSI C 引用($'')用于在 $'' 中将 \t 解释为文字制表符(在 bash 及类似环境中)。


2
我认为 tr 命令可以更快地完成这个任务:tr -d '[[^:print:]\t]' < file.txt - chthonicdaemon
4
好主意,但您可能是指 tr -dC '[:print:]\t\n'(无法使用 ^tr,且外部的 [] 将被视为要匹配的字符;另外需要保留 \n)。 - mklement0
1
@heemayl:感谢您的更新;展示一个与BSD Sed兼容的解决方案非常棒(我也会保留这个解决方案),但值得注意的是,由于问题标记为“linux”,因此使用_GNU_ Sed时,普通的单引号字符串就足够了,它可以本地理解\t。或者,将\t替换为[:blank:]也可以避免这个问题。 - mklement0

10
为确保Sed命令的有限范围内工作,请强制使用"C"(POSIX)字符分类,以避免在处理非ASCII字符时出现不可预测的行为:

"C" (POSIX) character classifications

LC_ALL=C sed 's/[^[:blank:][:print:]]//g' file.txt

2
好的观点,但是要明确说明:您的解决方案还会删除非ASCII“字母”,例如é - mklement0
1
@mklement0 感谢您的纠正,您已经抓住了重点,即哪个字符在范围内或范围外是问题所在。只有原帖作者才知道,因为他知道上下文。 - NeronLeVelu

4

请在Linux命令提示符下运行以下命令:

选项1:(如果Linux机器已安装dos2unix命令)

dos2unix sample_file.txt

选项-2:
cat sample_file.txt | tr -d '\015' > new_sample_file.txt

1
谢谢您的回答,但您能帮我理解一下“tr -d '\015'”是什么意思吗? - josh
它删除了八进制代码为015的字符,该字符在ASCII中表示回车符,但在不同的编码中可能表示其他内容。 - RiverHeart

-1

在 vi 或 vim 中尝试以下操作:

[在 ESC 模式下] 输入::%s/^M//g

或者:

sed -e "s/^M//" filename > newfilename

重要提示:输入 ^M,请先按下CTRL-V,然后再按下CTRL-M。


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