2011-12-22 182 views
0

我在PHP文件中进行替换,我需要用sed改变语言变量。在这里我的工作代码:用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

'。*'而不是'*'...? – BRFennPocock 2011-12-22 20:06:26

回答

1

sed中,星号(*)字符表示“重复先前的事情0次或更多次”。这与壳体形成对比,在壳体中扩展到任何东西。你想要做的是推一个.(意为“什么”),星号前右,像这样:

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

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

1

这是因为*不符合您的想法。在sed正则表达式中,与所有正则表达式一样,使用.*?表示任何字符集合(除换行符外)。这是因为.意味着匹配任何一次,并且*意味着匹配任何次数的前一个项目。 ?使其非贪婪,这意味着只要表达式的其余部分匹配,就会匹配尽可能少的字符。我不知道你输入的是什么,所以我不能告诉你是否需要问号,比对不起更安全。

1

您需要用.*替换表达式中的**意味着“0个或更多的前一个项目的实例”(在这种情况下为"),所以你想先匹配.(任何字符),然后声明你想要那个0个或多个实例