正则表达式替换为sed

时间:2011-12-22 20:04:44

标签: regex linux bash command-line sed

我正在PHP文件中进行替换,我需要使用sed更改语言变量。这是我的工作代码:

sed -i '' -e "s/\$config\['language'\]  = \"english\";/\$config['language'] = '$LANGUAGE';/" Sources/$APP/application/config/config.php

这不符合任何语言集:

sed -i '' -e "s/\$config\['language'\]  = \"*\";/\$config['language'] = '$LANGUAGE';/" Sources/$APP/application/config/config.php

怎么了?

3 个答案:

答案 0 :(得分:1)

sed中,星号(*)字符表示“重复前一次0次或更多次”。这与外壳相反,它可以扩展到任何东西。你想要做的是在星号之前推一个.(意思是“任何东西”),如下所示:

sed -i '' -e "s/\$config\['language'\]  = \".*\";/\$config['language'] = '$LANGUAGE';/" Sources/$APP/application/config/config.php

然后会告诉你的程序“重复任何字符(.)任意次(*)”。

答案 1 :(得分:1)

那是因为*没有按照您的想法行事。在sed正则表达式中,与所有正则表达式一样,使用.*?表示任何字符集合(换行符除外)。这是因为.表示匹配任何一次,*表示与前一项匹配任意次。 ?使其非贪婪,这意味着只要表达式的其余部分匹配,它就会匹配尽可能少的字符。我不知道你输入了什么,所以我无法判断你是否需要问号,比抱歉更安全。

答案 2 :(得分:1)

您需要将表达式中的*替换为.**表示“前一项的0个或多个实例”(在本例中为"),因此您要先匹配.(任何字符),然后声明您想要0或更多的实例