[英]Using sed to replace string in file with contents of variable of that name
[英]Sed string replace using environment variable
我遇到在环境中设置变量的情况,我必须用它的值替换文件中的那些变量。
例如,我有很多变量集,其中很少有 FRUIT=APPLE,TIME=DAILY。 文本文件的内容是
The $$FRUIT$$ is good for health. Everyone should eat $$FRUIT$$ $$TIMES$$.
现在我想要一个 sed 命令来搜索 $$$$ 中的任何字符串并将其用作环境变量以获取值并将其替换到文件中。
The APPLE is good for health. Everyone should eat APPLE DAILY.
我试过了
sed -i -E "s|$$([A-Z]+)$$|${\1}|g" test.txt
和其他多种组合,但它不起作用。
它给我错误-bash: s|$$([AZ]+)$$|${\1}|g: bad substitution
这从我如何在shell脚本中动态解释变量的答案中窃取了? -这个问题是不是一个相当重复。
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
我们搜索模板字符串,捕获带有美元符号的整个字符串,还仅捕获其中的变量名称。 然后,我们使用外壳参数扩展,使用间接变量扩展将匹配的模板字符串替换为变量的值 。
这从我如何在shell脚本中即时解释变量的答案中窃取了? -这个问题不是那个问题的重复。
前提是变量是环境的一部分:
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的含义。
这是仅使用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.
这是一种使用ENVIRON
数组在单个gnu-awk
命令中执行此操作的方法,无需涉及任何其他实用程序。
s='The $$FRUIT$$ is good for health. Everyone should eat $$FRUIT$$ $$TIMES$$'
export FRUIT='APPLE'
export TIMES='DAILY'
awk '{
while (match($0, /\$\$([_[:alnum:]]+)\$\$/, a))
$0 = substr($0, 1, RSTART-1) ENVIRON[a[1]] substr($0, RSTART+RLENGTH)
} 1' <<< "$s"
The APPLE is good for health. Everyone should eat APPLE DAILY
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.