gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:17:29 24 4
gpt4 key购买 nike

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

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

关于regex - sed 正则表达式无法按预期工作。管道和文件不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45566754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com