2014-07-24 38 views
4

如何用空格替換項目符號(八進制值:225,十六進制值:95)?
我試着用下面的命令:

用空格替換所有項目符號

echo '•test' | tr '\225' ' ' 

echo '•test' | awk '{gsub(/\225/," ");print $0}' 

echo '•test' | sed 's/\o225/ /g' 

echo '•test' | LANG='' sed 's/\o225/ /g' 

echo '•test' | sed 's/\x95/ /g' 


上述命令不起作用。

回答

7

讓我們看一下爲什麼你目前的努力是失敗:

$ echo '•test' | hexdump -C 
00000000 e2 80 a2 74 65 73 74 0a       |...test.| 
00000008 

這些子彈實際上是三個字節 - e2 80 a2,不是一個單一的0x95

校正的SED表達正常工作:

echo '•test' | sed -e 's/•/ /g' 

...或(使用/bin/sh不可用的bash擴展語法)...

echo '•test' | sed -e $'[email protected]\xe2\x80\[email protected] @g' 

...或(使用bash -builtin替換功能):

s='•test'    # original string in s 
orig='•'    # item to replace 
new=' '    # thing to replace it with 
s2=${s//"$orig"/$new} # result in s2 

...或(使用GNU sed擴展,每@anubhava)...

echo '•test' | sed '[email protected]\xe2\x80\[email protected] @g' 
+0

或者:'echo'•test'| sed's/\ xe2 \ x80 \ xa2 /'' – anubhava

+0

爲什麼使用at符號(@)?我使用以下命令進行測試:echo'•test'| sed's/\ xe2 \ x80 \ xa2// g'。有用。 – user2874781

+1

@ user2874781,我習慣使用'@'作爲習慣,因爲'/'經常存在被替換的內容,使得它成爲sigil的一個糟糕的選擇。在這種特殊情況下,既不存在,也不會以任何方式產生特別的差別。(在許多情況下,選擇一個不能在數據內部的印記的需要使得'sed'完全是一個糟糕的工具選擇)。 –

3

作爲優良的答案由查爾斯達菲,對應於字符子彈字節補體取決於所使用的文件編碼的可能有所不同。

作爲一個例子,所述子彈是:

  • 單字節0x95如果文件被編碼爲(視窗)CP1252

  • 單字節0xa5如果文件被編碼爲(傳統)Macintosh Roman 編碼

  • 如果文件編碼爲UTF-8,則爲三個字節的序列


對於 「一個字節編碼」,tr是一個大發現。至於我自己,我會青睞一個稍微不同的語法,但應該工作:

sh$ tr $'\x95' ' ' < cp1252.txt 
test 

sh$ tr $'\xa5' ' ' < mac.txt 
test 

如果你的文件是UTF-8編碼的......好吧,你已經有答案了!

+0

+1:我沒有查找'0x95'假設來自哪種編碼,但它是有用的背景。 –

相關問題