我想从某个文件中删除非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.
答案 0 :(得分:13)
这似乎不适用于sed
。也许tr
会做什么?
tr -d '\200-\377'
或补充:
tr -cd '\000-\177'
答案 1 :(得分:6)
你试过吗
cat /bin/mkdir | tr -cd "[:print:]"
我认为它解决了这个问题?
如果只有您感兴趣的文字内容,您也可以使用
cat /bin/mkdir | strings
答案 2 :(得分:3)
您知道该文件目前使用的编码方式吗?如果是这样,您可以使用iconv进行转换。它是一种从一种字符编码转换为另一种字符编码的实用程序。因此,如果原始文件是UTF-8并且您想要转换为ASCII,则可以使用以下内容:
iconv -f utf8 -t ascii <inputfile>
输入文件上的file命令可能会告诉您当前的编码。
有趣的是,有一个名为enca的命令,如果您知道文件内容的语言,它将尽力确定正在使用的字符编码。
这other question可能就是答案。
答案 3 :(得分:1)
尝试 sed -i 选项,例如
sed -i 's/[\d128-\d255]//g' MYFILE.txt
它将替换文件中的所有非ascii字符。
答案 4 :(得分:1)
这里提供的解决方案对我不起作用。也许我的问题有所不同,但是我需要从原本纯的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$