2013-02-28 117 views
4

我想從某個文件中刪除非ASCII字符。你能幫我找出正確的方法嗎?如何使用sed刪除非ASCII字符

我已經嘗試了很多正則表達式。

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

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

but this aa file contains some non-ascii chars. 
[[email protected] ~]$ hexdump /tmp/aa|more 
      00 01 02 03 04 05 06 07 - 08 09 0A 0B 0C 0D 0E 0FABCDEF 

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. 

回答

12

這似乎不適用於sed。或許tr會做?

tr -d '\200-\377' 

或者與補充:

tr -cd '\000-\177' 
+0

不能在mac-osx上工作:( – 2017-02-14 13:03:54

+0

@EladTabak:它應該可以工作,你能舉出一個不行的例子嗎? – Thor 2017-02-17 16:33:02

2

你知道當前使用什麼編碼文件?如果是這樣,你可以使用iconv來轉換它。這是一種將一種字符編碼轉換爲另一種字符的實用工具。因此,如果原始文件是UTF-8,要轉換爲ASCII,你可以使用以下命令:

iconv -f utf8 -t ascii <inputfile> 

輸入文件的文件命令可能會告訴你當前的編碼。

有趣的是,有一個名爲enca的命令,如果您知道文件內容的語言,它將盡其所能確定正在使用的字符編碼。

這可能是other question的答案。

+0

我在linux系統上工作,它的命令池非常有限,'iconv'不可用。 – user87005 2013-02-28 11:00:05

+0

看一下hexdump的輸出,這是一個二進制文件嗎? (從ELF開始猜測)如果是這樣,刪除非ASCII字符的目的是什麼?二進制文件將被損壞。 – chooban 2013-02-28 11:01:40

+0

這只是一個例子,朋友。 – user87005 2013-02-28 11:02:56

6

你嘗試

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

我認爲它解決了什麼問題?

如果只有文字內容的興趣,你也可以使用

cat /bin/mkdir | strings 
0

嘗試用SED -i選項,例如。

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

它將替換文件中的所有非ascii字符。