Sed循环遍历文件并替换占位符变量

时间:2013-11-26 15:01:51

标签: linux bash shell sed debian

我希望使用bash循环遍历文件并将所有占位符变量转换为实际变量:

  • $ PLACEHOLDER_USER - > $ USER
  • $ PLACEHOLDER_STATE - > $ STATE

它需要使用以占位符开头的任何变量,并将其转换为实数变量。这是我到目前为止的代码:

$FILE="/mytest.conf"
sed -i "s/$var1/$var2/g" "$FILE"

但是我不确定如何让它循环遍历整个文件,而且我不确定如何使用以$PLACEHOLDER_开头的任何变量。

1 个答案:

答案 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字符。)