使用 sed 僅刪除字串中出現的特定文本

使用 sed 僅刪除字串中出現的特定文本

我有一個文字文件,其中包含許多行此類內容:

/*[17:51:27][1 ms]*/ UPDATE `country` SET `region_id` = '4' WHERE `country_id` = '36'; 

有什麼方法可以sed刪除評論僅有的,這就是以 a 開頭/*並以 a 結尾的所有內容*/?這將使該行變為:

UPDATE `country` SET `region_id` = '4' WHERE `country_id` = '36';

我知道如何sed刪除以某些內容開頭的整行,在包含 SQL 的文字檔案的範例中,它可能是一個哈希符號#

答案1

因為sed以某種greedy方式進行匹配,所以總是有可能匹配評論末尾之後的文本,而不是前面的真實評論結束標記,例如。如包含“*/”的帶引號的字串。
這不能以簡單的方式處理sed,但您可以解決它。這是一種這樣的方法:使用單字元佔位符作為兩個字元的結束分隔符號。使用十六進制值\x01作為替代字元是安全的(即不會與現有文字衝突),因為它在普通文字中不存在。

sed "\|^/\*.*\*/|{ s|\*/|\x01|; s|.*\x01|| }" "$file"

perl另一方面,可以選擇處理lazy匹配(以及更多)。正如已經提到的約翰衛斯理王子在評論中,這是懶惰的 perl相等的。

perl -ple 's|/\*.*?\*/||g' "$file"

答案2

試試這個:

sed 's@/\*[^/]*\*/@@'

不幸的是,它可能在/內部評論方面遇到困難。

兩種變體結合在一起可能會很有用:以確保絕對所有註釋都被刪除:

sed 's@/\*[^/]*\*/@@;s@/\*[^*]*\*/@@;'

相關內容