我的目标是更换所有"特殊"文本文件中的字符串,并用系统变量替换它们。例如,输入将像这样:
__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中有什么可以做的吗?
答案 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