Sed来遍历文件并replace占位符variables

我希望使用bash来遍历一个文件,并将所有的占位符varialbes变成真正的variables:

  • $ PLACEHOLDER_USER – > $ USER
  • $ PLACEHOLDER_STATE – > $ STATE

它需要与任何以占位符开始的variables一起工作,并把它变成它的实际variables。 这是迄今为止的代码:

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

不过,我不知道如何让它遍历整个文件,我不知道如何使任何variables以$ PLACEHOLDER_开头

任何帮助,将不胜感激。

Solutions Collecting From Web of "Sed来遍历文件并replace占位符variables"

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 -f -读取另一个sed实例。 (这在所有平台上都不被支持,但是至少应该在Linux上工作,如果你不支持,你可以通过将脚本写入临时文件或使用命令替换来解决这个问题。

env列出了你的环境变量。 第一个sed脚本将会在\$PLACEHOLDER_前面加上每个变量名称的前缀,然后生成一个sed的代码片段,用它的环境值代替它的任何出现。 (注意:如果值包含正则表达式元字符,则需要一个更为复杂的脚本,如果这些值可以包含斜杠,则需要用另一个分隔符替换斜线分隔符;您可以使用任何您喜欢的ASCII字符。