Regex sed正则表达式无法按预期工作。管道和文件不同

Regex sed正则表达式无法按预期工作。管道和文件不同,regex,linux,Regex,Linux,我在文本文件中有一个字符串,我想在其中替换版本号。引号可以从“到”不等。=周围的空格也可以存在,也可以不存在: $data['MODULEXXX_VERSION'] = "1.0.0"; 为了测试,我使用 echo "_VERSION'] = \"1.1.1\"" | sed "s/\(_VERSION.*\)[1-9]\.[1-9]\.[1-9]/\11.1.2/" 这很好用 当我将其更改为在文件中搜索时(文件具有相同的字符串): ,它什么也没找到 在玩了regex的搜索部分后,我发现了另

我在文本文件中有一个字符串,我想在其中替换版本号。引号可以从
不等。
=
周围的空格也可以存在,也可以不存在:

$data['MODULEXXX_VERSION'] = "1.0.0";
为了测试,我使用

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

当我将其更改为在文件中搜索时(文件具有相同的字符串):

,它什么也没找到

在玩了regex的搜索部分后,我发现了另一件奇怪的事情:

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
什么也找不到了,为什么

我正在使用Ubuntu17.04桌面


任何人都可以解释我做错了什么?对于字符串
$data['modulexx_version']=“***0.0”

最主要的问题是
[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
。当要替换的变量的内容可能包含正则表达式的特殊字符时,这一点就变得更加重要。

主要问题是
[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
。当要替换的变量的内容可能包含正则表达式的特殊字符时,这一点就变得更加重要。

第二个引擎找不到任何内容,因为
[1-9]
0
不匹配。请使用
[0-9]
@hek2mgl nice catch:D。我也找不到。这就是问题所在。第二个没有找到任何东西,因为
[1-9]
0
不匹配。使用
[0-9]
@hek2mgl nice catch:D。我也找不到。这就是问题所在。