我希望使用bash循环遍历文件并将所有占位符变量转换为实际变量:
它需要使用以占位符开头的任何变量,并将其转换为实数变量。这是我到目前为止的代码:
$FILE="/mytest.conf"
sed -i "s/$var1/$var2/g" "$FILE"
但是我不确定如何让它循环遍历整个文件,而且我不确定如何使用以$PLACEHOLDER_
开头的任何变量。
答案 0 :(得分:3)
sed
的默认操作是读取并打印输入文件的每一行。您可以通过编写sed
脚本以各种方式修改此行为。典型的脚本就像
sed -i "s/\\\$PLACEHOLDER_USER/$USER/g;s/\\\$PLACEHOLDER_STATE/$STATE/g" file
注意这里的引用;双引号允许shell将$USER
和$STATE
替换为来自环境的值,而反斜杠的美元符号将不会被替换。因此shell执行一些替换,并且在实际运行sed
时,脚本已成为
sed -i 's/\$PLACEHOLDER_USER/fred/g;s/\$PLACEHOLDER_STATE/Arkansas/g' file
(我在这里提供单引号以强调不会进行进一步的替换。)
在更一般的情况下,sed
无权访问您的环境变量,但您可以编写一个shell脚本,从您的变量生成sed
脚本。
env | sed 's%^\([^=]*\)=\(.*\)%s/\\\$PLACEHOLDER_\1/\2/g%' | sed -f - file
这有点棘手。第一个sed
脚本的输出是另一个sed
脚本,由另一个sed
实例使用sed -f -
读取。 (并非所有平台都支持此功能,但至少应该在Linux上运行。如果您不支持此功能,可以通过将脚本写入临时文件或使用命令替换来解决此问题。)
env
列出了您的环境变量。第一个sed
脚本将使用\$PLACEHOLDER_
为每个变量名称添加前缀,并生成sed
的代码段,以将其中任何出现的值替换为来自环境的值。 (警告:如果值包含正则表达式元字符,则需要一个明显更复杂的脚本。如果值可以包含斜杠,则需要将斜杠分隔符替换为另一个分隔符;您可以使用任何您喜欢的ASCII字符。)