Linux

在 shell 腳本中使用 sed 替換文件中的 IP 地址

  • April 18, 2012

我有一個腳本可以在文件中找到一個字元串,用一個新字元串替換它。

$ sed -i 's/$old_string'/'$new_string'/g' $FILENAME

現在我需要條件是一個正則表達式,它還檢查舊字元串是否後跟除數字之外的任何內容。

我試過了,但沒有用:

$ sed -i -r 's/$old_string(^[0-9])+/$new_string/g' $FILENAME

任何的想法?

要否定正則表達式中的範圍,插入符號必須位於方括號內。

sed -i -r 's/$old_string([^0-9])+/$new_string/g' $FILENAME

在這種情況下,如果您不使用反向引用,括號也是不必要的(而且看起來不像。)

sed -i -r 's/$old_string[^0-9]+/$new_string/g' $FILENAME

最後一件事:bash 不會解析單引號內的變數,因此$old_string不會$new_string被您可能在腳本中設置的任何 bash 變數替換,但會在該sed命令中按字面意思使用。如果您使用雙引號,它們將被替換。

sed -i -r "s/$old_string[^0-9]+/$new_string/g" $FILENAME

更新:

由於文件在您要替換的字元串之後不包含任何內容[^0-9]+,因此正則表達式的部分沒有可匹配的內容。如果 IP 地址後面有空格,它會起作用。我們可以將行尾匹配為$.

sed -i -r 's/123.123.123.1$/4.4.4.4/g' $FILENAME

還有一個更新。這個匹配任何不是數字或根本沒有字元的字元。對於這一點,我們需要括號來對這兩個選項進行分組。

sed -i -r 's/123.123.123.1([^0-9]+|$)/4.4.4.4/g' $FILENAME

由於我們有括號,因此您可以使用反向引用來包含匹配的內容:

sed -i -r 's/123.123.123.1([^0-9]+|$)/4.4.4.4\1/g' $FILENAME

引用自:https://serverfault.com/questions/380573