【发布时间】:2019-04-09 09:29:30
【问题描述】:
我在使用 Bash 4.4.23 的 GNU/Linux 系统上,并且我有一个包含一些 Bash 变量的文件:
例如
export VARONE="var1"
export VARTWO="var2"
...
我必须将“templates”文件夹下其他扩展名为“.template”的文件中的${VARIABLE}替换为{{VARIABLE}}。
我尝试执行这个命令:
cat varfile \
| grep export \
| awk -F '=' '{print $1}' \
| awk '{print $2}' \
| xargs -I var -- \
find templates -type f -iname "*.template" \
-exec sed 's/${var}/{{var}}/g' {} \;
但我没有运气 :( sed 似乎与这个 LHS 不匹配,实际上它将原始文件打印为输出。
谁能解释一下上面的命令有什么问题?
【问题讨论】:
-
您需要
-i选项到sed以使其更新文件到位。否则它只会在标准输出上打印结果。 -
顺便说一句,如果您以竖线字符 (
|) 结束一行,则无需转义换行符,仍然可以缩进下一个命令。您可以将grep export varfile作为第一行并且不需要cat。如果您使用方括号,您可以列出多个字符作为awk的分隔符,并且可以合并您的两个awk命令。这些都回答您的问题;这只是你可能想要调整以方便阅读和性能的观察,尽管我怀疑性能确实会杀死你。 :) -
@PaulHodges 感谢您的建议,StackOverflow 已自动添加换行符转义,可能是因为我已将所有命令写在一行中。我不知道 awk 的多个分隔符选项,我真的很感激。
-
@Barmar 是的,你是对的,我已经意识到缺少 -i 来测试命令导致我出错,我的命令在将替换写入时实际上可以很好地工作文件,非常感谢。
-
@PaulHodges 逃脱来自 ruakh 的编辑。