首页 > 解决方案 > 将 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

谢谢。

标签: bashdateawksed

解决方案


您可以内联多行 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

推荐阅读