2016-07-17 90 views
3

我試過sed -i '/^/d' myfile並刪除了整個文件。如何避免這種情況?我想刪除其中包含^的所有行。刪除所有包含插入符號的行(^)

+0

這已經回答了:http://stackoverflow.com/questions/5410757/delete-lines-in-a-text-file-that-c​​ontaining-a-specific-string 最終也讀取:http://stackoverflow.com/questions/407523/escape-a-string-for-a-sed-replace-pattern – PawelSz

+0

我的問題是與克拉,而不是一個字符,但我的標題被改變。 – Pete

+0

我的不好,已經撤消了。無論如何,也許標題可以改爲「特殊字符」,使其更通用? – pah

回答

5
sed -i '/\^/d' myfile 

您需要轉義^特殊字符。

3

在正則表達式中,「特殊」字符在括號表達式(方括號)內存在時會失去其特殊含義。所以你會認爲搜索[^]將是你需要的。

唉,事實證明,雖然這適用於脫字符號,但脫字符號在括號表達式的第一個字符時會獲得不同的特殊含義。它用於否定表達式。所以[^]實際上是無效的正則表達式語法,並且這個字符仍然需要被轉義。

你在找什麼,在GNU sed的,可能看起來像:

sed -i '/[\^]/d' myfile 

這看起來很笨拙(特別是與@ threadp的答案),但我更喜歡方括號的方式來逃避特價因爲它以同樣的方式處理所有其他特殊字符,並且其行爲在正則表達式解析器中是一致的。反斜槓用於其他事情 - 在shell腳本中繼續行,將字符轉換爲特殊字符(\n,\t等)。太多的反斜槓會讓事情變得混亂。

需要注意的一件有趣的事情是,如果插入符號是第一個字符,則插入符號僅在括號表達式中是特殊的。所以下面的工作:

$ printf 'one\ntwo^\n' | sed -ne '/[X^]/p' 
two^ 
+1

我一般都喜歡'[]'的方法,但在'^'的具體情況下,我不太確定,因爲'^'在字符類中的第一個字符時也是一個特殊字符。 – ruakh

+0

總的來說很好,但'^'實際上是 - 唯一的 - 字符。即使在字符集內部也需要逃避_作爲第一個字符_,因爲它在那裏具有特殊含義:否定由剩餘字符形成的字符集/範圍;因此,在這種情況下,您確實需要'[\ ^]'。 – mklement0

+0

修改後的表單或您的推薦:將^ ^轉義爲\ ^',它適用於所有正則表達式方言;放置_any其他的字符._你想在'[[]]'內被視爲文字,但如果適用的話,在_end_處放置'-',以避免在字符集內_its_特殊解釋(作爲_range_運營商)。 – mklement0

相關問題