linux - Sed 遍历文件并替换占位符变量

标签 linux bash shell sed debian

我希望使用 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/

相关文章:

linux - 从 Linux 上的用户空间 Hook 系统调用

linux - 如何理解 pid() 和 new_pid 在执行 forktracker.stp 时是相同的值?

bash - 为什么这个简单的 bash 陷阱会失败

bash - bash 陷阱后恢复

shell - Powershell 模块和调用文件

c - 在 C 中的特定端口上运行服务守护进程?

linux - Bash Script_将从读取命令读取的变量插入命令

linux - 格式化许多记录,使用公共(public)键将行转换为列

Java 主类自动完成

c - for循环中的数组未获得正确的值