我有几个文本文件,其中引入了shell变量($VAR1或$VAR2).

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

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

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

这在非常基本的文件上非常有效.

但在更复杂的文件上,"eval"命令做得太多了:

  • 将跳过以"#"开头的行

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

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

亲切的问候

推荐答案

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

因此,这让它变得简单:

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

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

Linux相关问答推荐

一个bash脚本,用于基于2列映射文件替换多个文件名中的模式

如何注释掉SLURM中的延迟调度命令?

如何在 shell 脚本中自定义 SFTP 详细输出

从 MariaDB 连接到 Oracle 时出现错误消息libsqora.so.11.1:找不到文件

如何使用netcat为DPDK实例提供输入?

操作系统信号处理循环 - 阻塞或非阻塞读取?

用于替换 struct 文档中文本的 Bash 脚本

将文件的一部分插入到另一个文件的特定位置

编译过度对齐的动态分配变量时出现 icpc 错误

在 SLURM 作业(job)脚本中设置和传递字符串变量

我如何从 Ubuntu 上的源代码自己构建 python?

PuTTY:更改默认 SSH 登录目录

pthread_exit 与返回

如何在 Linux 中创建高分辨率计时器来测量程序性能?

如何在 Linux 上传递带感叹号的参数?

试运行 cron 条目

Linux上C中的标准输出线程安全?

rm 没有释放磁盘空间

docker compose:加载共享库时出错:libz.so.1:无法从共享对象映射段:不允许操作

如何为 Git 命令设置自动完成功能?