bash 用于替换文件中出现的所有占位符的脚本
bash script to replace all occurrences of placeholders in file
我正在尝试编写一个 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{}/g' filename
这假定 VAR1
和 VAR2
是环境变量(即,export
ed),以便 Perl 可以从其环境中挑选它们。任何不纯粹的方法都需要这样做 shell;我只是提到它以避免混淆。
其工作原理如下:
s/pattern/replacement/g
是替换命令;你可能会从 sed 中认出它。不同的是,这里我们可以使用Perl 更强大的regex 引擎和变量。 g
标志使得所有匹配项都被替换;没有它,它将仅适用于第一个。
- 在模式中,
.*?
是非贪婪匹配的,因此在包含 foo {{VAR1}} bar {{VAR2}} baz
的行中,模式 {{.*?}}
只匹配 {{VAR1}}
而不是 {{VAR1}} bar {{VAR2}}
.
{{
和}}
之间的部分被捕获,因为它在()
之间,可以作为</code></li>重复使用
替换中的 <li><code>$ENV{}
使用包含 Perl 进程环境的特殊 %ENV
散列。 $ENV{}
是名称为
的环境变量的值,这是之前捕获的组。
只有 bash
和 sed
:
$ VAR1='example'
$ VAR2='file'
$ export VAR1 VAR2
$ sed -e '{s/{{\([^{]*\)}}/${}/g; s/^/echo "/; s/$/";/}' -e e filename
This is an example file.
It should work across multiple lines in this file.
sed -e '{s/{{\([^{]*\)}}/${}/g;}' filename
:
This is an ${VAR1} ${VAR2}.
It should work across multiple lines in this ${VAR2}.
{{\([^{]*\)}}
- 搜索 {{..}}
[^{]
- 非贪婪匹配
</code> - 访问括号内的值 <code>\(...\)
.
sed -e '{s/{{\([^{]*\)}}/${}/g; s/^/echo "/; s/$/";/}' filename
:
echo "This is an ${VAR1} ${VAR2}.";
echo "It should work across multiple lines in this ${VAR2}.";
s/^/echo "/
- 将行首替换为 echo "
s/$/";/
- 将行尾替换为 ";
我只是在玩你原来的方法。在 $varName
上添加另一个循环行不通?
cat example.txt | grep -o '{{.*}}' > temp
while read placeholder; do
varName=$(echo "$placeholder" | tr -d '{}')
for i in $varName; do
value="${!i}"
sed -i "s/{{$i}}/$value/g" example.txt
done
done < temp
rm -rf temp
我正在尝试编写一个 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{}/g' filename
这假定 VAR1
和 VAR2
是环境变量(即,export
ed),以便 Perl 可以从其环境中挑选它们。任何不纯粹的方法都需要这样做 shell;我只是提到它以避免混淆。
其工作原理如下:
s/pattern/replacement/g
是替换命令;你可能会从 sed 中认出它。不同的是,这里我们可以使用Perl 更强大的regex 引擎和变量。g
标志使得所有匹配项都被替换;没有它,它将仅适用于第一个。- 在模式中,
.*?
是非贪婪匹配的,因此在包含foo {{VAR1}} bar {{VAR2}} baz
的行中,模式{{.*?}}
只匹配{{VAR1}}
而不是{{VAR1}} bar {{VAR2}}
. {{
和}}
之间的部分被捕获,因为它在()
之间,可以作为</code></li>重复使用 替换中的 <li><code>$ENV{}
使用包含 Perl 进程环境的特殊%ENV
散列。$ENV{}
是名称为的环境变量的值,这是之前捕获的组。
只有 bash
和 sed
:
$ VAR1='example'
$ VAR2='file'
$ export VAR1 VAR2
$ sed -e '{s/{{\([^{]*\)}}/${}/g; s/^/echo "/; s/$/";/}' -e e filename
This is an example file.
It should work across multiple lines in this file.
sed -e '{s/{{\([^{]*\)}}/${}/g;}' filename
:This is an ${VAR1} ${VAR2}. It should work across multiple lines in this ${VAR2}.
{{\([^{]*\)}}
- 搜索{{..}}
[^{]
- 非贪婪匹配</code> - 访问括号内的值 <code>\(...\)
.
sed -e '{s/{{\([^{]*\)}}/${}/g; s/^/echo "/; s/$/";/}' filename
:echo "This is an ${VAR1} ${VAR2}."; echo "It should work across multiple lines in this ${VAR2}.";
s/^/echo "/
- 将行首替换为echo "
s/$/";/
- 将行尾替换为";
我只是在玩你原来的方法。在 $varName
上添加另一个循环行不通?
cat example.txt | grep -o '{{.*}}' > temp
while read placeholder; do
varName=$(echo "$placeholder" | tr -d '{}')
for i in $varName; do
value="${!i}"
sed -i "s/{{$i}}/$value/g" example.txt
done
done < temp
rm -rf temp