2017-02-09 31 views
4

因此,我有一個文本文件,其中包含ASCII STX字符(可以用\ x02定位)撒在整個文件中。如果他們不在行尾,我想刪除它們。替換一個值,除了在行尾

# This removes all STX characters 
sed -i 's/\x02//g' foo.txt 

# This removes STX characters that are at the end of a line 
sed -i 's/\x02$//g' foo.txt 

如果一個字符不在行尾?

+0

提示:你如何知道給定的字符是否在給定行的末尾? – 2017-02-09 21:00:42

+5

試試'sed -i's/\ x02 \(。\)/ \ 1/g'foo.txt' –

+0

也許你正在使用正則表達式'\ x02 [^ $]'?此外,你可能希望展望未來,不要用'[^ ​​$]' – Isaac

回答

3

您可以匹配和捕捉在一個或多個字符,你需要刪除恢復它後用反向引用任何字符:

sed -i 's/\x02\{1,\}\(.\)/\1/g' foo.txt 

這裏,\x02\{1,\}比賽1,或者您需要刪除多個字符, \(.\)將匹配並捕獲到組1中的任何字符,並且\1將恢復結果中的捕獲的字符。

+0

啊,非常聰明。 – david

+0

我注意到一個似乎失敗的邊緣案例。如果有兩個STX字符相鄰。一個沒有被刪除。但是,如果它們不是緊密相連的,它會在一行中處理多個STX字符。 – david

+2

@david:然後擴展它以匹配一個或多個STX:'sed -i's/\ x02 \ {1,\} \(。\)/ \ 1/g''。如果你有'-E'或'-r'選項到'sed',你可以使用擴展的正則表達式來寫它,而不需要太多的反斜槓。 –