【问题标题】:Sed to loop through file and replace placeholder variablesSed 循环遍历文件并替换占位符变量
【发布时间】:2013-11-26 15:01:50
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您能否提供mytest.conf 的样本及其预期输出。

标签: linux bash shell sed debian


【解决方案1】:

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 的sn-p,以将任何出现的变量替换为其环境中的值。 (警告:如果值包含正则表达式元字符,您将需要一个复杂得多的脚本。如果值可以包含斜杠,您需要将斜杠分隔符替换为另一个分隔符;您可以使用任何您喜欢的 ASCII 字符。)

【讨论】:

  • 感谢您,这正是我所需要的!如果您希望输出转到其他文件,则可以省略 -i 选项,并添加 > output.conf 以将 sed 的输出重定向到文件。还需要注意的是,在 Mac OS X 上执行此操作时,您需要使用 -i "" 而不是仅使用 -i 来进行就地编辑,因为 Mac OS X 源自 BSD 并使用 BSD 风格的 sed。
猜你喜欢
  • 2017-09-08
  • 2014-07-27
  • 2014-12-15
  • 2018-12-16
  • 2017-09-11
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
相关资源
最近更新 更多