如何替换复杂文本文件中的 shell 变量

新手上路,请多包涵

我有几个文本文件,我在其中引入了 shell 变量(例如 \(VAR1 或 \)VAR2)。

我想把这些文件(一个接一个)保存在所有变量都被替换的新文件中。

为此,我使用了以下 shell 脚本(在 StackOverflow 上找到):

 while read line
do
    eval echo "$line" >> destination.txt
done < "source.txt"

这对非常基本的文件非常有效。

但是在更复杂的文件上,“eval”命令做的太多了:

  • 以“#”开头的行被跳过

  • XML 文件解析导致大量错误

有更好的方法吗? (在 shell 脚本中……我知道这很容易用 Ant 完成)

亲切的问候

原文由 Ben 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 894
2 个回答

看,原来在我的系统上有一个 envsubst 命令,它是 gettext-base 包的一部分。

所以,这很容易:

 envsubst < "source.txt" > "destination.txt"

请注意,如果您想为两者使用相同的文件,则必须使用类似 moreutil 的 sponge ,正如 Johnny Utahh 所建议的那样: envsubst < "source.txt" | sponge "source.txt" 。 (因为 shell 重定向会在读取之前清空文件。)

原文由 derobert 发布,翻译遵循 CC BY-SA 4.0 许可协议

关于答案 2,在讨论 envsubst 时,您问:

如何使它与在我的 .sh 脚本中声明的变量一起工作?

答案是您只需要在调用 envsubst 之前导出变量。

您还可以使用 envsubst SHELL_FORMAT 参数来限制要在输入中替换的变量字符串(避免使用常见的 shell 变量值意外替换输入中的字符串 - 例如 $HOME )。

例如:

 export VAR1='somevalue' VAR2='someothervalue'
MYVARS='$VAR1:$VAR2'

envsubst "$MYVARS" <source.txt >destination.txt

Will replace all instances of $VAR1 and $VAR2 (and only VAR1 and VAR2 ) in source.txt with 'somevalue''someothervalue' 分别。

原文由 Michael 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题