当源包含时如何替换为sed$

当源包含时如何替换为sed$,sed,escaping,echo,Sed,Escaping,Echo,我有一个包含以下内容的文件: $conf['minified_version'] = 100; $conf['minified_version'] = @MINIFIED_VERSION@ 我想用sed增加100,所以我有: sed -r 's/(.*minified_version.*)([0-9]+)(.*)/echo "\1$((\2+1))\3"/ge' 问题是,这会将$conf与原始文件以及任何缩进间距一起剥离。我能理解的是,这是因为它试图运行: echo " $conf[

我有一个包含以下内容的文件:

$conf['minified_version'] = 100;
$conf['minified_version'] = @MINIFIED_VERSION@
我想用sed增加100,所以我有:

sed -r 's/(.*minified_version.*)([0-9]+)(.*)/echo "\1$((\2+1))\3"/ge'
问题是,这会将
$conf
与原始文件以及任何缩进间距一起剥离。我能理解的是,这是因为它试图运行:

echo "    $conf['minified_version'] = $((100+1));"

因此,它当然试图用一个没有值的变量替换
$conf

我建议的方法是在磁盘上有一个文件,该文件只包含缩小的\u版本号。然后,增加该数字将非常简单:

minified_version=$(< minified_version)
printf '%s\n' "$(( minified_version + 1 ))" >minified_version
…然后您可以在构建过程中简单地运行:

sed -e "s/@MINIFIED_VERSION@/$(<minified_version)/g" <foo.conf.in >foo.conf

以下是awk版本:

$ awk '/minified_version/{$3+=1} 1' file
$conf['minified_version'] = 101

这将查找包含
缩小的\u版本
的行。只要找到这样一行,第三个字段,
$3
,就会递增。

这里的问题与源代码中的
$
无关——您已经在以不包含任何文本的方式编写正则表达式了,因此,您避免了在表达式的开头放置一个行结束锚的明显错误(您也可以通过从
^[$]
开始避免这种错误)。相反,它与尝试让
sed
在生成替换内容时对shell命令求值有关,它不支持,也从来没有这样做过。谢谢!这是一个非常干净的解决方案——它省略了行末尾的分号,但简单的解决方法是在数字和分号之间留出一个空格
$ awk '/minified_version/{$3+=1} 1' file
$conf['minified_version'] = 101