我希望使用 bash 循环遍历文件并将所有占位符变量转换为实际变量:
- $PLACEHOLDER_USER -> $USER
- $PLACEHOLDER_STATE -> $STATE
它需要处理任何以占位符开头的变量,并将其转换为真正的变量。这是我到目前为止的代码:
$FILE="/mytest.conf"
sed -i "s/$var1/$var2/g" "$FILE"
但是我不确定如何让它遍历整个文件,我也不确定如何使用以 $PLACEHOLDER_
开头的任何变量。
最佳答案
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 字符。)
关于linux - Sed 遍历文件并替换占位符变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20220612/