2017-08-08 65 views
0

我有一个文本文件中的字符串,我想要替换版本号。引号可以从'"变化。同时围绕=空间可以在那里,可以没有很好:sed正则表达式不能按预期方式工作。不同的管道和文件

$data['MODULEXXX_VERSION'] = "1.0.0"; 

为了测试我使用

echo "_VERSION'] = \"1.1.1\"" | sed "s/\(_VERSION.*\)[1-9]\.[1-9]\.[1-9]/\11.1.2/" 

它完美的作品。

当我改变它在文件中(该文件具有相同的字符串)搜索:

sed "s/\(_VERSION.*\)[1-9]\.[1-9]\.[1-9]/\11.1.2/" -i test.php 

,它没有发现任何东西。

与正则表达式的搜索部分打完后,我发现一个更奇怪的事情:

sed "s/\(_VERSION.*\)[1-9]\./\1***/" -i test.php 

作品和字符串变为$data['MODULEXXX_VERSION'] = "***0.0";,但

sed "s/\(_VERSION.*\)[1-9]\.[1-9]/\1***/" -i test.php 

不会再发现任何东西。为什么?

我使用的是Ubuntu 17.04桌面。

任何人都可以解释我做错了什么?用字符串$data['MODULEXXX_VERSION'] = "***0.0";替换文件中版本号的最佳命令是什么?

+1

第二个找不到任何东西,因为'[1-9]'不匹配'0'。使用'[0-9]' – hek2mgl

+1

@ hek2mgl好的catch:D。我也找不到。这是整个问题。 – MichalH

回答

2

主要问题是[1-9]与版本号中的0不匹配。您需要使用[0-9]


除此之外,你可以使用以下命令sed

sed -r 's/(.*_VERSION['\''"]]\s*=\s*).*/\1"1.0.1";/' conf.php 

这不看看现在的价值,它只是替换=后的一切。

我用-r它使扩展posix正则表达式这使得它更容易制定模式。

另外一种也许更清洁的尝试是将conf.php存储像conf.php.tpl模板,然后使用模板引擎渲染的文件。或者,如果你真的想用sed,该文件可能看起来像:

$data['FOO_VERSION'] = "FOO_VERSION_TPL"; 

然后只需使用:

sed 's/FOO_VERSION_TPL/1.0.1/' conf.php.tpl > conf.php 

如果有多个值替换:

sed \ 
    -e 's/FOO/BAR/' \ 
    -e 's/HELLO/WORLD/' \ 
    conf.php.tpl > conf.php 

但我建议使用模板引擎而不是sed。当要替换的变量的内容可能包含特殊于正则表达式的字符时,这变得更加重要。

相关问题