【问题标题】:How to remove all special characters in Linux text如何删除 Linux 文本中的所有特殊字符
【发布时间】:2017-03-30 04:04:00
【问题描述】:

如何去除图片1中显示为蓝色的特殊字符,如:^M、^A、^@、^[。在我的理解中,^M 是一个windows换行符,我可以用sed -i '/^M//g'来删除它,但是它不能删除其他的。命令dos2unix 也不起作用。有什么方法可以用来删除它们吗?

【问题讨论】:

    标签: linux sed non-printable


    【解决方案1】:

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

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

    [:print:] 包括:

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

    ANSI C 引用 ($'') 用于将 \t 解释为 $'' 中的文字选项卡(在 bash 等中)。

    【讨论】:

    • 我认为tr 会更快:tr -d '[[^:print:]\t]' < file.txt
    • @chthonicdaemon: 好主意,但你可能是指tr -dC '[:print:]\t\n'(不能将^tr 一起使用,而外部的[] 将被视为要匹配的字符;还需要保留\n)。
    • @heemayl:感谢更新;很高兴展示一个适用于 BSD Sed 的解决方案(我也会保留该解决方案),但值得注意的是,鉴于该问题已标记为 linux,因此常规单引号字符串将与 GNU Sed,它本身就理解 \t。或者,将\t 替换为[:blank:] 将绕过该问题。
    【解决方案2】:

    为确保该命令在 Sed 中的有限范围内工作,请强制使用 "C" (POSIX) character classifications 以避免非 ASCII 字符出现不可预知的行为:

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

    【讨论】:

    • 好点,但只是明确说明:您的解决方案还删除了非 ASCII 字母,例如é
    • @mklement0 感谢您的更正,您明白了,这是哪个字符在范围内或范围外的问题。只有 OP 可以知道,因为他知道上下文
    【解决方案3】:

    尝试在 linux 命令提示符下运行以下命令

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

    dos2unix sample_file.txt
    

    选项 - 2:

    cat sample_file.txt | tr -d '\015' > new_sample_file.txt
    

    【讨论】:

    • 谢谢你,但你介意帮助我理解“tr -d '\015' 的作用吗?
    【解决方案4】:

    在 vi 或 vim 中试试这个:

    [in ESC mode] type: :%s/^M//g

    或:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      相关资源
      最近更新 更多