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
关键说明
- 正则匹配:
'[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}_[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}'精准匹配单引号内的YYYY-MM-DD_HH:MM:SS格式,确保只替换日期数字部分。 - 行过滤:
/^\s*start_date/限定仅处理以start_date开头的行(忽略前置空格),避免误修改其他无关行。 - 优化效率:一次性调用
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
相关产品推荐
相关产品推荐

