【问题标题】:How to remove non-ascii chars using sed如何使用 sed 删除非 ascii 字符
【发布时间】:2023-03-15 19:57:01
【问题描述】:

我想从某个文件中删除非 ascii 字符。我已经尝试了这么多正则表达式。

sed -e 's/[\d00-\d128]//g'  # not working

cat /bin/mkdir | sed -e 's/[\x00-\x7F]//g' >/tmp/aa

但此文件包含一些非 ascii 字符。

[root@asssdsada ~]$ hexdump /tmp/aa |more
          00 01 02 03 04 05 06 07 - 08 09 0A 0B 0C 0D 0E 0F  0123456789ABCDEF

00000000  45 4C 46 B0 F0 73 38 C0 - C0 BC BC FF FF 61 61 61  ELF..s8......aaa
00000010  A0 A0 50 E5 74 64 50 57 - 50 57 50 57 D4 D4 51 E5  ..P.tdPWPWPW..Q.
00000020  74 64 6C 69 62 36 34 6C - 64 6C 69 6E 75 78 78 38  tdlib64ldlinuxx8
00000030  36 36 34 73 6F 32 47 4E - 55 42 C8 C0 80 70 69 42  664so2GNUB...piB
00000040  44 47 BA E3 92 43 45 D5 - EC 46 E4 DE D8 71 58 B9  DG...CE..F...qX.
00000050  8D F1 EA D3 EF 4B 86 FC - A9 DA 79 ED 63 B5 51 92  .....K....y.c.Q.
00000060  BA 6C FC D1 69 78 30 ED - 74 F1 73 95 CC 85 D2 46  .l..ix0.t.s....F
00000070  A5 B4 6C 67 DA 4A E9 9A - 4B 58 77 A4 37 80 C0 4F  ..lg.J..KXw.7..O
00000080  F3 E9 B2 77 65 97 74 F9 - A2 C0 F2 CC 4A 9C 58 A1  ...we.t.....J.X.

【问题讨论】:

    标签: regex linux unix sed non-ascii-characters


    【解决方案1】:

    这似乎不适用于sed。也许tr 可以?

    tr -d '\200-\377'
    

    或者用补语:

    tr -cd '\000-\177'
    

    【讨论】:

    • @EladTabak:应该可以。你能举一个 is 不起作用的例子吗?
    • 在 macOS High Sierra 上,我收到此错误:tr: Illegal byte sequence
    • @codeforester:我用来自 GNU coreutils 的 tr 测试了这个
    • tr -cd '\001-\177' 删除 NULL 字符确实值得删除,许多工具(如 grep)如果输入包含空值,则将其识别为二进制。二进制文件(标准输入)匹配。
    【解决方案2】:

    你试过了吗

    cat /bin/mkdir | tr -cd "[:print:]"
    

    我认为它解决了问题?

    如果你只对文本内容感兴趣,你也可以使用

    cat /bin/mkdir | strings
    

    【讨论】:

      【解决方案3】:

      这里提供的解决方案对我不起作用。也许我的问题不同,但我需要从纯 ASCII 文本中去除 ASCII 颜色和其他字符。

      以下对我有用,但是:

      从 ASCII 文本中去除转义码

      sed -E 's/\x1b\[[0-9]*;?[0-9]+m//g'
      

      在上下文中(BASH):

      $ printf "\e[32;1mhello\e[0m\n"
      hello
      
      $ printf "\e[32;1mhello\e[0m\n" | cat -vet
      ^[[32;1mhello^[[0m$
      
      $ printf "\e[32;1mhello\e[0m\n" | sed -E 's/\x1b\[[0-9]*;?[0-9]+m//g' | cat -vet
      hello$
      

      【讨论】:

        【解决方案4】:

        你知道文件当前使用的是什么编码吗?如果是这样,您可以使用 iconv 对其进行转换。它是一种从一种字符编码转换为另一种字符编码的实用程序。因此,如果原始文件是 UTF-8 并且您想转换为 ASCII,您可以使用以下内容:

        iconv -f utf8 -t ascii <inputfile>
        

        输入文件的文件命令可能会告诉你当前的编码。

        有趣的是,如果您知道文件内容的语言,有一个名为enca 的命令将尽力确定所使用的字符编码。

        这个other question 可能就是答案。

        【讨论】:

        • 我正在使用 linux 系统,该系统的命令池非常有限,并且 'iconv' 不可用。
        • 查看 hexdump 的输出,这是一个二进制文件吗? (从ELF开始猜测)如果是这样,删除非ASCII字符的目的是什么?二进制文件将被损坏。
        • 这只是一个例子,朋友。
        • 啊,酷。我添加了一个相关问题的链接,它可能会解决您的问题。
        • 这个 perl 命令也可以正常工作,但我需要 sed。猫/bin/mkdir | perl -ne 's/[^[:ascii:]]//g;print $_;'
        【解决方案5】:

        尝试使用 sed -i 选项,例如。

        sed -i 's/[\d128-\d255]//g' MYFILE.txt
        

        它将替换文件中的所有非ASCII字符。

        【讨论】:

        • 至少对我来说——在我的文件上运行它会删除所有小写 ascii 字符
        猜你喜欢
        • 2012-01-24
        • 1970-01-01
        • 1970-01-01
        • 2013-11-29
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多