awk - 不要在 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 -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_DATE
awk
sd
ed
gsub("{start_date}", sd); gsub("{end_date}", ed)
- 用这些值替换占位符文本1
替换print
更短且执行相同操作的命令。
推荐阅读
- reactjs - 使用 componentDidUpdate() 当你的状态是一个对象数组时如何避免无限循环?
- sql - 如何对 CASE 语句中创建的列进行分组
- c++ - 如何在 C++ 中修复“对 Array::Array(unsigned long) 的未定义引用”?
- ios - 当应用程序进入后台时显示覆盖所有内容的窗口
- python - 如何仅使用特定域名限制登录 google api?
- r - 在数据框中按因子应用 approxfun
- python - Python Regex 编译拆分字符串,以便单词首先出现
- web-hosting - 短期网络托管
- sumo - 如何在win8上的SUMO中使用randomTrips.py
- gradle - 将 gradle 属性文件指定为 gradlew 的命令行参数