Ubuntu

sed 正則表達式問題

  • July 21, 2014

我正在嘗試替換文件中的字元串:

$RELEASE     = '1234';

RELEASE 和 = 符號之間的空格可以是空格或製表符。版本號周圍的引號可以是單引號或雙引號。

我目前假設空格和單引號只是為了讓它工作:

sed 's/$RELEASE[[:space:]]*\=[[:space:]]*'\''[0-9]*'\'';/$RELEASE = '\''1234'\'';/g' config.ini > config.ini

因此,經過大量工作,這行得通。但前提是字元串是空格(與製表符相對)和單引號與雙精度相對。到目前為止,這是我試圖解決標籤的內容……:

sed 's/$RELEASE([[:space:]]|\t)*\=([[:space:]]|\t)*'\''[0-9]*'\'';/$RELEASE = '\''1234'\'';/g' config.ini > config.ini

我剛剛讀到大多數 sed 正則表達式不支持 /t ……這是真的嗎?有沒有

$$ [:tab: $$] 類型替換?(我確實嘗試過) 任何幫助,將不勝感激。

我沒有任何問題[[:space:]]。這是一個非常愚蠢的小範例,顯示了空格和製表符的混合替換:

$ echo -e 'A \t \t B' | sed 's/A[[:space:]]*B/WORKED/'
WORKED

您還可以使用\swhich 通常更適合大sed字元串,因為它要短得多:

$ echo -e 'A \t \t B' | sed 's/A\s*B/WORKED/'
WORKED

無論如何,我認為你的實際問題是逃避那些麻煩的單引號。我發現最簡單的方法是打破單引號字元串並使用雙引號單引號,然後(如果需要)返回單引號行。Bash 會自動為你連接這一切。

$ echo 'This is a nice string and this is a single quote:'"'"' Nice?'
This is a nice string and this is a single quote:' Nice?

因此,我們節省的所有空間都將\s被這種超級報價情況破壞:

$ echo -e '$RELEASE  \t = '"'"'1234'"'"';' |\
 sed 's/$RELEASE\s*=\s*'"'"'[0-9]*'"'"'\;/REPLACEMENT/'

當然,有一個論點(因為這看起來像一個 PHP 腳本),您可以假設如果該行以您開頭,$RELEASE[\s=]+則可以替換整行。顯然並非總是如此(整個應用程序可能是一條可怕的線),但它使您的搜尋和替換更可口:

sed 's/$RELEASE[\s=]*.*/REPLACEMENT/'

是的,一般sed使用規則適用。不要回顯到流編輯器(如sed)並重定向回該文件。如果它有效,您可以輕鬆地破解文件。

使用-i參數(適用於sed)或管道到像海綿這樣的應用程序(就像延遲輸出):

sed -i '...' file
sed '...' file | sponge file

引用自:https://unix.stackexchange.com/questions/145709