即使单个RegEx表达式似乎正确,sed在bash脚本中也不起作用

时间:2018-08-10 19:21:28

标签: regex sed

我要做什么

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

#!/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

诊断

此方法有效: I checked the RegEx here 使用^php_version: "[0-9]+\.[0-9]+"进行搜索,使用php_version: "7.0"进行替换(您可以找到替换项并粘贴到在下面的标签中输入文本。注意,我只能在末尾使用/gm使搜索生效。我不知道如何在sed中使用多行? ?

环境

  • Windows 10 Pro主机
  • 使用MINGW64 git bash终端
  • 这些文件是Docker容器的一部分
  • 我尝试在我的MINGW64 git bash终端中以及在Ubuntu容器中运行此sed

3 个答案:

答案 0 :(得分:2)

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

sed -i "s/^php_version: \"[0-9][0-9]*\.[0-9][0-9]*\"/php_version: \"${phpVersion}\"/g" fileToSearchReplace.txt

或使用扩展的正则表达式选项-r

sed -r -i "s/^php_version: \"[0-9]+\.[0-9]+\"/php_version: \"${phpVersion}\"/g" fileToSearchReplace.txt

示例:https://repl.it/repls/PowderblueFoolishEquipment

答案 1 :(得分:2)

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

您有一个经典的混合案例,其中站点的正则表达式模式是扩展正则表达式,而您的sed中的正则表达式使用不支持您的{{1 }}表达式。只需使用[0-9]+中的-E开关启用ERE支持

sed

请参阅[POSIX | GNU ]是同一解决方案的变体,其中POSIX版本使用BRE,而GNU版本使用ERE。请仔细阅读POSIX Regular Expressions上的这篇有用的文章,了解正则表达式的两个变体如何工作。

答案 2 :(得分:1)

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

select ver in "5.6" "7.0" "7.1" "7.2"; do
    sed -i "s/^\(php_version: \).\+/\1\"$ver\"/" fileToSearchReplace.txt
    break
done