繁体   English   中英

Sed 字符串替换使用环境变量

[英]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的含义。

这是仅使用sedgrep

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM