我有一个包含几行的文件,在某些行中有一个变量,如下所示:

The-first-line
The-second-${VARIABLE}-line
The-third-line

在bash脚本中,我希望读取行并解析存在的任何变量.

VARIABLE=Awesome
LINES=$(echo $(cat file.txt))
for i in $LINES
do :
  echo "$i"
done

输出与输入文件(未解析的变量)相同,但我希望如下所示:

The-first-line
The-second-Awesome-line
The-third-line

提前感谢您的帮助!

推荐答案

您可以try 以下操作(使用支持nameref的bash的最新版本):

while IFS= read -r line; do
  while [[ "$line" =~ (.*)\$\{([^}]+)\}(.*) ]]; do
    declare -n var="${BASH_REMATCH[2]}"
    printf -v line '%s%s%s' "${BASH_REMATCH[1]}" "$var" "${BASH_REMATCH[3]}"
  done
  printf '%s\n' "$line"
done < file.txt

在最内层的循环中,只要有${VARIABLE}个变量引用,我们就迭代,并将其替换为变量的值,这要感谢BASH_REMATCHvar nameref和printf-v选项.

Linux相关问答推荐

BASH-SCRIPT-在特定行合并两个文件

UTF-8输入和使用XGetICValues

Qt会泄漏内存吗?

在 Ansible 中使用 JSON 查询过滤数据以从 ansible_fact 中提取数据

Docker 容器立即退出

如何/在哪里可以找到要修复的 Linux 内核错误?

如何指定链接时使用的库版本?

如何忽略 diff 命令中的一些差异?

用于判断进程是否正在运行并对结果采取行动的 Linux 脚本

如何有效地使用 grep?

Linux 非阻塞 fifo(按需日志(log)记录)

安装 mod_ssl 亚马逊 Linux

无法创建Java虚拟机

qstat 和长作业(job)名称

错误:ld.so:无法预加载对象 LD_PRELOAD:忽略

给定一个 linux 用户名和密码,我如何测试它是否是有效帐户?

从线程内Forking 是否安全?

网络共享文件夹上的 GIT 存储库中的并发性

Linux:删除多个文件的文件扩展名

find -name "*.xyz" -o -name "*.abc" -exec 对所有找到的文件执行,而不仅仅是指定的最后一个后缀