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

vin*_*len 12 linux sed non-printable

vim pic 如何删除图片1中显示为蓝色的特殊字符,如:^ M,^ A,^ @,^ [.根据我的理解,^ M是一个Windows换行符,我可以sed -i '/^M//g'用来删除它,但它不能删除其他人.该命令dos2unix也不起作用.是否有任何方法可以用来删除它们?

hee*_*ayl 16

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

sed $'s/[^[:print:]\t]//g' file.txt
Run Code Online (Sandbox Code Playgroud)

[:print:] 包括:

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

ANSI C quoting($'')用于解释\t内部$''(in bash和alike)的文字选项卡.

  • 我认为`tr`会更快地做到这一点:`tr -d '[[^:print:]\t]' < file.txt` (2认同)
  • @chthonicdaemon:好主意,但是您可能意味着`tr -dC'[:print:] \ t \ n'`(不能将`^`与`tr`一起使用,而将外部`[]`视为要匹配的字符;还需要保留`\ n`)。 (2认同)

Ner*_*elu 7

为确保该命令在Sed中的作用域有限,请强制使用“ C”(POSIX)字符分类,以避免非ASCII字符出现不可预测的行为:

LC_ALL=C sed 's/[^[:blank:][:print:]]//g' file.txt
Run Code Online (Sandbox Code Playgroud)

  • 好点,但只是明确说明一下:您的解决方案还删除了非 ASCII _字母_,例如 `é`。 (2认同)