Linux
在 shell 腳本中使用 sed 替換文件中的 IP 地址
我有一個腳本可以在文件中找到一個字元串,用一個新字元串替換它。
$ 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