edo*_*tan 3 linux shell centos sed regular-expressions
我有一个脚本,它在文件中找到一个字符串并将其替换为一个新字符串。
$ sed -i 's/$old_string'/'$new_string'/g' $FILENAME
Run Code Online (Sandbox Code Playgroud)
现在我需要条件是一个正则表达式,它还检查旧字符串后面是否有除数字以外的任何内容。
我试过这个,但没有用:
$ sed -i -r 's/$old_string(^[0-9])+/$new_string/g' $FILENAME
Run Code Online (Sandbox Code Playgroud)
任何的想法?
要否定正则表达式中的范围,插入符号必须在方括号内。
sed -i -r 's/$old_string([^0-9])+/$new_string/g' $FILENAME
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果您不使用反向引用(并且看起来不像),则括号也是不必要的。
sed -i -r 's/$old_string[^0-9]+/$new_string/g' $FILENAME
Run Code Online (Sandbox Code Playgroud)
最后一两件事:庆典不分析变量单引号内,所以$old_string并$new_string不会因为你可能在你的脚本已经确定,但将在字面上使用任何bash的变量代替sed命令。如果您使用双引号,它们将被替换。
sed -i -r "s/$old_string[^0-9]+/$new_string/g" $FILENAME
Run Code Online (Sandbox Code Playgroud)
更新:
由于文件在要替换的字符串之后不包含任何内容[^0-9]+,因此正则表达式的部分没有任何匹配项。如果 IP 地址后面有一个空格,它会起作用。我们可以用 匹配行尾$。
sed -i -r 's/123.123.123.1$/4.4.4.4/g' $FILENAME
Run Code Online (Sandbox Code Playgroud)
再来一波更新。这个匹配任何不是数字或根本没有字符的字符。对于这个,我们需要括号来组合这两个选项。
sed -i -r 's/123.123.123.1([^0-9]+|$)/4.4.4.4/g' $FILENAME
Run Code Online (Sandbox Code Playgroud)
由于我们有括号,您可以使用反向引用来包含匹配的内容:
sed -i -r 's/123.123.123.1([^0-9]+|$)/4.4.4.4\1/g' $FILENAME
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22669 次 |
| 最近记录: |