首页 > 解决方案 > 不要在 awk 中转义变量

问题描述

我有一个像这样的文本文件 a.txt:

start_date:{start_date};end_date:{end_date}

我想在 shell 脚本中替换 {start_date} 和 {end_date}。

#!/bin/bash
START_DATE="2021-06-01"
END_DATE="2021-06-02"
awk '{gsub(/{start_date}/, '$START_DATE'); gsub(/{end_date}/, '$END_DATE');print $0 }' a.txt

我想得到类似的东西:

start_date:2021-06-01,end_date:2021-06-02

但实际上我得到了:

start_date:start_date:2014;end_date:2013

似乎变量 START_DATE 和 END_DATE 是在脚本中计算的。它尝试用双引号包裹变量,但也失败了。如何在 awk 中逃脱它们?

标签: awk

解决方案


您可以使用

awk -v sd="$START_DATE" -v ed="$END_DATE" '{gsub("{start_date}", sd); gsub("{end_date}", ed)}1' a.txt

在哪里

  • -v sd="$START_DATE" -v ed="$END_DATE"- 将变量传递给脚本START_DATE并使用这些值初始化变量END_DATEawksded
  • gsub("{start_date}", sd); gsub("{end_date}", ed)- 用这些值替换占位符文本
  • 1替换print更短且执行相同操作的命令。

推荐阅读