在这种情况下,需要在环境中设置变量,并且必须用文件的值替换这些变量。
例如,我有很多变量集,其中只有FRUIT = APPLE,TIME = DAILY。文本文件的内容是
$$ FRUIT $$对健康有益。每个人都应该吃$$ FRUIT $$ $$ TIMES $$。
现在,我希望使用sed命令在$$$$中搜索任何字符串,并将其用作env变量以获取值并将其替换到文件中。
苹果对健康有益。每个人都应该每天吃苹果。
我尝试了sed -i -E "s|$$([A-Z]+)$$|${\1}|g" test.txt
和其他多种组合,但没有用。
它给我错误-bash: s|$$([A-Z]+)$$|${\1}|g: bad substitution
答案 0 :(得分:1)
这从我对How can I interpret variables on the fly in the shell script?的回答中窃取了-这个问题不是相当的重复。
str='The $$FRUIT$$ is good for health. Everyone should eat $$FRUIT$$ $$TIMES$$'
FRUIT=APPLE
TIMES=DAILY
while [[ $str =~ ('$$'([[:alnum:]_]+)'$$') ]]; do
str=${str//${BASH_REMATCH[1]}/${!BASH_REMATCH[2]}}
done
echo "$str"
The APPLE is good for health. Everyone should eat APPLE DAILY
我们搜索模板字符串,捕获带有美元符号的整个字符串,还捕获其中的变量名。然后,使用外壳参数扩展,使用间接变量扩展,将匹配的模板字符串替换为变量的 value 。
答案 1 :(得分:1)
这是从How can I interpret variables on the fly in the shell script?的答案中窃取的-这个问题并不是那个问题的重复。
提供了变量是环境的一部分:
export FRUIT="APPLE"
export TIMES="DAILY"
您可以使用envsubst
GNU工具执行变量替换:
echo 'The $$FRUIT$$ is good for health. Everyone should eat $$FRUIT$$ $$TIMES$$.' | sed -E 's/\$\$([A-Z]+)\$\$/${\1}/g' | envsubst
The APPLE is good for health. Everyone should eat APPLE DAILY.
请注意,您需要在$
字符前加反斜杠,因为该字符具有sed的含义。
答案 2 :(得分:0)
这是仅使用sed
和grep
的方法
list=$(grep -wo "\\$\S\S*\\$" test2 | sort -u | tr '$' '\n');
for thing in ${list[@]}; do sed -i 's/\$\$'$thing'\$\$/'$"${!thing}"'/g' test2; done
下面是一些解释(不言而喻)
user$ echo $TIMES
DAILY
user$ echo $FRUIT
APPLE
user$ cat test2
The $$FRUIT$$ is good for health. Everyone should eat $$FRUIT$$ $$TIMES$$.
user$ list=$(grep -wo "\\$\S\S*\\$" test2 | sort -u | tr '$' '\n');
user$ echo $list
FRUIT TIMES
user$ for thing in ${list[@]}; do sed -i 's/\$\$'$thing'\$\$/'$"${!thing}"'/g' test2; done
user$ cat test2
The APPLE is good for health. Everyone should eat APPLE DAILY.