bash - 将 2 个 awk 或 sed 语句合并为一个并保存现有文件
问题描述
我的目标是只修改以数据开头的行,只有其中一个。在这一行中,我将替换 51-80 个字符和 97-126 个字符。我宁愿有一个带 sed 的衬里,因为这样我就可以使用该-i
标志,然后它会按需保存文件。
这是我正在修改的文件中的行:
data = '{\n"feature_name": "ALL",\n"start_date": "2020-06-07T08:34:00.000-06:00",\n"end_date": "2020-06-08T13:35:00.000-06:00",\n"product": "SAEP",\n"limit":1000\n}'
这是我的两个 awk 语句,它们正在修改字符串的 start_date 和 end_date 部分。我已经包含了两个变量,用于获取 start_date 的当前时间减去 15 分钟前以及 end_date 的当前时间:
ctime=`date +%Y-%m-%dT%H:%M:%S.%3N-00:00`
fifteen_min_ago=`date -d "15 mins ago" +%Y-%m-%dT%H:%M:%S.%3N-00:00`
awk '$1 ~ /^data/{printf "%s%*s%s\n",substr($0,1,m-1),n-m,"'$fifteen_min_ago'",substr($0,n)}' m=51 n=80 file
awk '$1 ~ /^data/{printf "%s%*s%s\n",substr($0,1,m-1),n-m,"'$ctime'",substr($0,n)}' m=97 n=126 file
这很好用,但我需要保存文件。如果我运行两个单独的 awk 命令,它一次只修改一个。因此,要么我将它们结合起来并用 awk 保存,要么需要一个我可以使用的 sed 单线-i
。
谢谢。
解决方案
您可以内联多行 awk 脚本,也可以将两条语句放在一个文件中。为每个“通过”使用不同的变量名
awk '
$1 ~ /^data/ {
$0 = sprintf("%s%*s%s\n",substr($0,1,m-1),n-m,"'$fifteen_min_ago'",substr($0,n))
$0 = sprintf("%s%*s%s\n",substr($0,1,m2-1),n2-m2,"'$ctime'",substr($0,n2))
}
{ print }
' m=51 n=80 m2=97 n2=126 file > file.new &&
mv file.new
请注意,还有其他(更简单)的方法可以实现问题中实现的替换。这与问题中描述的方法最相似。
使用 SED,更换更容易:
ctime=$(date +%Y-%m-%dT%H:%M:%S.%3N-00:00)
fifteen_min_ago=$(date -d "15 mins ago" +%Y-%m-%dT%H:%M:%S.%3N-00:00)
sed -e 's/"start_date": "[^"]*"/"start_date": "'$ctime'"/' \
-e 's/"end_date": "[^"]*"/"end_date": "'$fifteen_min_ago'"/' < file > file.new && mv file.new file
推荐阅读
- json - 使用 Avro 文件批量复制到 Amazon Redshift 中的异常处理
- architecture - 软件架构:服务层和业务层有自己的模型吗
- python - os.path.isfile() 仅当文件在目录中时才返回 true
- excel - 如何访问非活动工作表中的活动单元格?
- laravel-routing - 未定义变量:posts(查看:C:\xampp\htdocs\fpog\resources\views\pages\index.blade.php)
- ios - 将 iOS SwiftUI TextField 的键盘保持在屏幕上,直到用户输入正确的输入
- c++ - 使用模板在 C++ 中生成随机数的高斯分布
- html - 输入字段没有响应显示 flex
- java - 使用没有 Spring/CDI 的普通 Java Servlet 创建一个新的 Vaadin Flow 16/17 项目
- python-3.x - Python为每个新请求运行新任务或循环