Regex 即使单个正则表达式看起来是正确的,sed在bash脚本中也不起作用 我想做什么

Regex 即使单个正则表达式看起来是正确的,sed在bash脚本中也不起作用 我想做什么,regex,sed,Regex,Sed,用用户输入的版本替换未注释的php_版本7.2的Bash脚本: #!/bin/bash # Ask desired PHP version read -p "What version of PHP should be used? (5.6, 7.0, 7.1, or 7.2): " phpVersion # Replace default php version with desired php version sed -i "s/^php_version: \"[0-9]+\.[0-9]+

用用户输入的版本替换未注释的php_版本7.2的Bash脚本:

#!/bin/bash

# Ask desired PHP version
read -p "What version of PHP should be used? (5.6, 7.0, 7.1, or 7.2): " phpVersion

# Replace default php version with desired php version
sed -i "s/^php_version: \"[0-9]+\.[0-9]+\"/php_version: \"${phpVersion}\"/g" fileToSearchReplace.txt
vim报告的fileToSearchReplace.txt的内容是一个unix文件:

APIVersion: v1.0.0
name: alpha-local
type: typo3
docroot: public
# php_version: "7.1"  # PHP version to use, "5.6", "7.0", "7.1", "7.2"
php_version: "7.2"
router_http_port: "80"
router_https_port: "443"
xdebug_enabled: false
additional_hostnames: []
additional_fqdns: []
provider: default
诊断学 这是有效的:使用^php_版本:[0-9]+\.[0-9]+进行搜索,使用php_版本:7.0进行替换,您可以在下面的文本选项卡中找到替换并粘贴。请注意,我只能在最后使用/gm来进行搜索。我不知道如何让多行在sed中工作

环境 Windows10Pro主机 使用MINGW64 git bash终端 这些文件是Docker容器的一部分 我试着在MINGW64 git bash终端和Ubuntu容器中运行这个sed 默认情况下,不能将+与sed一起使用。要么像这样做自己的+:

sed -i "s/^php_version: \"[0-9][0-9]*\.[0-9][0-9]*\"/php_version: \"${phpVersion}\"/g" fileToSearchReplace.txt
或者使用扩展正则表达式选项-r:

示例:

默认情况下,不能将+与sed一起使用。要么像这样做自己的+:

sed -i "s/^php_version: \"[0-9][0-9]*\.[0-9][0-9]*\"/php_version: \"${phpVersion}\"/g" fileToSearchReplace.txt
或者使用扩展正则表达式选项-r:


示例:

我认为从一个没有说明它支持哪类正则表达式的站点尝试正则表达式并在命令中重复使用它不是一个好主意

您有一个典型的混淆案例,其中站点中的regex模式是扩展正则表达式,而sed中的模式使用基本正则表达式构造,它不支持[0-9]+表达式。只需在sed中使用-E开关启用ERE支持


请参阅相同解决方案的[|]变体,POSIX版本使用BRE,GNU版本使用ERE。一定要通读这篇关于正则表达式的两个变体如何工作的有用文章。

我认为从一个没有说明它支持哪一类正则表达式的站点尝试一个正则表达式并在命令中重复使用它不是一个好主意

您有一个典型的混淆案例,其中站点中的regex模式是扩展正则表达式,而sed中的模式使用基本正则表达式构造,它不支持[0-9]+表达式。只需在sed中使用-E开关启用ERE支持


请参阅相同解决方案的[|]变体,POSIX版本使用BRE,GNU版本使用ERE。请通读这篇关于正则表达式的两个变体如何工作的有用文章。

您可以将此脚本与select一起使用,使用户可以从菜单列表中选择一个版本。然后,您可以将所选选项传递给简化的sed命令:


您可以将此脚本与select一起使用,使用户可以从菜单列表中选择版本。然后,您可以将所选选项传递给简化的sed命令:


我不认为-E是sed的一个选项。。。看起来在我的例子中是-r,但是你在需要扩展正则表达式的问题上一针见血,我对此一无所知。我不认为-E是sed的一个选项。。。在我的例子中看起来是-r,但是你在需要扩展正则表达式的问题上一针见血,我对此一无所知。我已经测试了这段代码,效果非常好。你也用select把我带到了下一个层次。您还通过使用。如果我理解正确,可以将任何字符匹配到行尾。很高兴知道它成功了,我已经测试了这段代码,效果非常好。你也用select把我带到了下一个层次。您还通过使用。如果我理解正确,请将任何字符匹配到行尾。很高兴知道它成功了,感谢您解释插入扩展正则表达式支持的-r选项。这是最接近我在解释为什么is不为我工作时看到的@anubhava紧随其后,不过添加了一种避免使用扩展正则表达式的替代方法。感谢您解释插入扩展正则表达式支持的-r选项。这是最接近我在解释为什么is不为我工作时看到的@anubhava紧随其后,不过增加了一种避免使用扩展正则表达式的替代方法。
sed -Ei "s/^php_version: \"[0-9]+\.[0-9]+\"/php_version: \"${phpVersion}\"/g" fileToSearchReplace.txt
select ver in "5.6" "7.0" "7.1" "7.2"; do
    sed -i "s/^\(php_version: \).\+/\1\"$ver\"/" fileToSearchReplace.txt
    break
done