用shell变量的扩展

时间:2017-01-11 18:59:31

标签: regex bash sed

我的目标是更换所有"特殊"文本文件中的字符串,并用系统变量替换它们。例如,输入将像这样:

__HOME__/properties/common/file.properties

这里的特殊字符串是__HOME__,我应该用系统$ HOME变量替换它。作为输出应该是:

/home/user/properties/common/file.properties

我试图用sed命令解决这个问题,我来到这一点:

echo __HOME__/properties/common/file.properties | sed -e 's/\(__\)\([A-Z]*\)\(__\)/\2/g'

作为输出,我得到HOME/properties/common/file.properties这是错误的。我试图将sed(此处为\2)的后向参考替换为echo \2,但这不起作用。在Bash中有什么可以做的吗?

4 个答案:

答案 0 :(得分:3)

可以使用perl

perl -lpe 's/__(.+?)__/$ENV{$1}/g' file

只检查具有__something__的字符串,并将其替换为shell中的环境变量。

答案 1 :(得分:2)

您可以使用eval

s='__HOME__/properties/common/file.properties'
eval "printf '%s\n' "$(sed 's/__\([A-Za-z_][a-zA-Z0-9_]*\)__/$\1/g' <<< "$s")""

/home/user111/properties/common/file.properties

答案 2 :(得分:2)

我们可以通过为sed表达式使用不同的分隔符来进一步简化此过程 - 我使用#代替/

path='__HOME__/properties/common/file.properties'
sed "s#__HOME__#$HOME#" <<< "$path"
# output => /Users/codeforester/properties/common/file.properties

由于sed表达式用双引号括起来,它会扩展$HOME并且$HOME扩展中的斜杠不会扰乱sed表达式,因为我们正在使用#作为分隔符。可以选择任何字符作为分隔符,只要它不会出现在表达式的任何其他部分中。

答案 3 :(得分:1)

可以使用Python

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"(\_.*\_)"

test_str = "__HOME__/properties/common/file.properties"

subst = "/home/potato"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

<强>结果:

/home/potato/properties/common/file.properties