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。我也找不到。这就是问题所在。