如何使用SED将日期中的英文月份替换为对应数字变量值?
解决日期中英文月份转数字的问题
问题分析
你之前的sed命令无法工作,原因有两个:
- sed默认使用基础正则表达式,
\w、{3}以及捕获组括号()都需要转义,正确的正则写法应该是\(\w\{3\}\); - 单引号包裹的内容不会被Shell解析,
${\1}既无法被sed识别,也没法引用你定义的月份变量。
下面提供几种可行的解决方案:
方案一:用Bash参数替换(适合单个日期参数处理)
利用Bash的间接变量引用${!var},直接提取月份并替换:
# 假设脚本接收的日期参数格式为YYYY-MMM-DD date_str="$1" # 提取中间的3位月份字符串 month=${date_str:5:3} # 替换后输出 echo "${date_str/$month/${!month}}"
如果不确定月份的位置,也可以用cut提取:
month=$(echo "$1" | cut -d'-' -f2) echo "${1/$month/${!month}}"
方案二:用Awk处理(适合批量文件或多数据)
将月份映射传递给Awk,用数组实现替换:
# 处理单个参数 echo "$1" | awk -v Jan=01 -v Feb=02 -v Mar=03 -v Apr=04 -v May=05 -v Jun=06 -v Jul=07 -v Aug=08 -v Sep=09 -v Oct=10 -v Nov=11 -v Dec=12 '{ split($0, parts, "-"); print parts[1] "-" (parts[2] in ENVIRON ? ENVIRON[parts[2]] : parts[2]) "-" parts[3] }' # 处理文件内容 awk -v Jan=01 -v Feb=02 -v Mar=03 -v Apr=04 -v May=05 -v Jun=06 -v Jul=07 -v Aug=08 -v Sep=09 -v Oct=10 -v Nov=11 -v Dec=12 '{ split($0, parts, "-"); print parts[1] "-" (parts[2] in ENVIRON ? ENVIRON[parts[2]] : parts[2]) "-" parts[3] }' your_date_file.txt
方案三:生成Sed替换规则(贴近你最初的思路)
通过Shell循环生成所有月份的Sed替换命令,再执行替换:
# 生成所有月份的替换规则 sed_rules="" for month in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec; do sed_rules="$sed_rules s/$month/${!month}/g;" done # 执行替换 echo "$1" | sed "$sed_rules"
内容的提问来源于stack exchange,提问作者sumaaiiiaaaa
相关产品推荐
相关产品推荐

