linux - 用于替换文件中所有出现的占位符的 bash 脚本

标签 linux bash awk sed

我正在尝试编写一个 bash 脚本,用同名的环境变量替换文件中出现的所有占位符。例如,如果我有如下文件...

This is an {{VAR1}} {{VAR2}}.
It should work across multiple lines in this {{VAR2}}.

...我设置了以下环境变量:

VAR1='example'
VAR2='file'

在我的文件上运行脚本后,我应该得到输出:

This is an example file.
It should work across multiple lines in this file.

我确信一定有一个使用 awk/sed 的解决方案,但到目前为止,如果一行中有多个变量,我所采用的最接近的解决方案无法处理。到目前为止,这是我的尝试:

cat example.txt | grep -o '{{.*}}' > temp
while read placeholder; do
  varName=$(echo "$placeholder" | tr -d '{}')
  value="${!varName}"
  sed -i "s/$placeholder/$value/g" "$file"
done < temp
rm -rf temp

最佳答案

我会使用 Perl:

perl -pe 's/{{(.*?)}}/$ENV{$1}/g' filename

这假设 VAR1VAR2 是环境变量(即,是 exported),以便 Perl 可以从它的环境。任何非纯 shell 的方法都需要这样做;我只是提到它以避免混淆。

工作原理如下:

  • s/pattern/replacement/g是替换命令;你可能会从 sed 中认出它。不同的是,这里我们可以使用Perl 更强大的regex 引擎和变量。 g 标志使得所有匹配都被替换;没有它,它将仅适用于第一个。
  • 在模式中,.*? 进行非贪婪匹配,因此在包含 foo {{VAR1}} bar {{VAR2}} baz 的行中,模式 {{.*?}} 只匹配 {{VAR1}} 而不是 {{VAR1}} bar {{VAR2}} .
  • {{}} 之间的部分被捕获,因为它在 () 之间,可以作为 $1
  • 替换中的
  • $ENV{$1} 使用包含 Perl 进程环境的特殊 %ENV 散列。 $ENV{$1} 是名称为 $1 的环境变量的值,这是之前捕获的组。

关于linux - 用于替换文件中所有出现的占位符的 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29919717/

相关文章:

linux - 在 Bash 的变量中执行 Perl 脚本

linux - Bash 跳过 python 命令

linux - 如何在 linux 中压缩其中一个后立即批量删除同一文件夹中的 mp4 文件?

awk - 如何使用 awk 打印最后两列

linux - 简单的 sed 替换

linux - 如何发送一个字节(或多个字节)来测试在我的应用程序中监听的套接字?

linux - 如何使用可启动 USB 在 Toshiba Satellite 中删除以前版本的 centos 7 并安装新的 centos 7

linux - 无法让我的程序运行 - %GC 计算器

regex - 使用 sed 替换复杂模式

c++ - 如何用C++实现Linux的Script命令