You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sed脚本字段替换异常求助:为何等号重复出现?

解决sed替换日期字符串时重复等号的问题

原脚本尝试替换文件中start_date和end_date对应的日期值,但因替换逻辑错误,执行后出现重复等号。问题出在sed命令直接替换了start_date/end_date开头的整段内容,而非仅替换日期数字部分。


原问题相关内容

原待替换字段:

start_date = '2023-01-25_00:00:00','2023-01-25_00:00:00',
end_date   = '2023-01-26_00:00:00','2023-01-26_00:00:00',

原脚本:

#!/bin/bash
year="2023"
month="01"
day="25"
hour="00"

fclen="2"
end_day=$(date +%d -d "$(date) + $fclen day")
end_year=$(date +%Y -d "$(date) + $fclen day")
end_month=$(date +%m -d "$(date) + $fclen day")
sed -i -e "s/^\s* start_date/ start_date = '${year}-${month}-${day}_00:00:00','${year}-${month}-${day}_00:00:00',/g" -e "s/^\s* end_date/ end_date   = '${end_year}-${end_month}-${end_day}_00:00:00',${end_year}-${end_month}-${end_day}_00:00:00',/g" ./namelist.wps

错误执行结果:

start_date = '2023-01-25_00:00:00', = '2023-01-25_00:00:00', = '2023-01-25_00:00:00','2023-01-25_00:00:00',
end_date   = '2023-01-28_00:00:00',   = '2023-01-28_00:00:00',   = '2023-01-26_00:00:00','2023-01-26_00:00:00',

修正方案

核心思路是仅替换日期字符串部分,保留start_date/end_date的键名和等号结构。通过正则匹配单引号内的日期时间格式,精准替换为目标值。

修改后的脚本:

#!/bin/bash
year="2023"
month="01"
day="25"
hour="00"

fclen="2"
# 一次性计算结束日期,减少date调用次数
end_date_str=$(date +"%Y-%m-%d" -d "$(date) + $fclen day")
end_year=$(echo "$end_date_str" | cut -d'-' -f1)
end_month=$(echo "$end_date_str" | cut -d'-' -f2)
end_day=$(echo "$end_date_str" | cut -d'-' -f3)

# 定义格式化后的目标日期值
start_date_val="'${year}-${month}-${day}_00:00:00'"
end_date_val="'${end_year}-${end_month}-${end_day}_00:00:00'"

# 精准替换日期部分:先过滤目标行,再替换行内的日期字符串
sed -i -e "/^\s*start_date/ s/'[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}_[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}'/$start_date_val/g" \
       -e "/^\s*end_date/ s/'[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}_[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}'/$end_date_val/g" ./namelist.wps

关键说明

  1. 正则匹配:'[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}_[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}' 精准匹配单引号内的YYYY-MM-DD_HH:MM:SS格式,确保只替换日期数字部分。
  2. 行过滤:/^\s*start_date/ 限定仅处理以start_date开头的行(忽略前置空格),避免误修改其他无关行。
  3. 优化效率:一次性调用date获取结束日期字符串,再拆分年/月/日,减少系统调用次数。

正确执行结果

start_date = '2023-01-25_00:00:00','2023-01-25_00:00:00',
end_date   = '2023-01-28_00:00:00','2023-01-28_00:00:00',

内容的提问来源于stack exchange,提问作者Zilore Mumba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:01:05