如何使用Bash将文件中日期的连字符替换为空格?
嘿,我来帮你搞定这个日期格式转换的问题!先理清楚核心需求和原脚本的问题,再给你高效的解决方案。
需求回顾
读取文件
extract_dates.dat(内容为:2017-03-23 2018-01-23 2017-07-31),将所有日期中的连字符-替换为空格,最终得到:2017 03 23 2018 01 23 2017 07 31
原脚本的问题分析
你的代码思路方向是对的,但有几个关键错误导致无法得到预期结果:
- 低效的行循环方式:用
wc -l统计行数再逐行遍历的写法既繁琐又容易出错(比如文件最后一行无换行符时会少统计),shell更推荐用while read直接逐行读取。 - 错误的行内容提取:
sed -n "${line}p" $filename | awk '{print $line}'这里逻辑混乱——awk中的$line并不是你shell里的$line变量,而且你要取整行内容的话,根本不需要awk,直接用sed -n "${line}p" "$filename"就足够。 - 正则表达式错误:
sed 's/([0-9])-([0-9])/\1\2/g'用了扩展正则的分组语法(),但sed默认使用基础正则,需要写成\( \);更关键的是,你的需求只是替换-为空格,完全不需要匹配前后的数字,这个正则写得冗余且错误。
高效解决方案
1. 一行命令搞定(适合单/多行文件)
如果只是完成转换需求,用tr或sed的一行命令最简洁:
# 用tr替换单字符,效率最高 tr '-' ' ' < extract_dates.dat # 或者用sed替换所有-为空格 sed 's/-/ /g' extract_dates.dat
2. 规范的Shell脚本写法(适合需要扩展逻辑的场景)
如果需要保留脚本结构方便后续扩展,推荐用while read逐行处理:
#!/bin/sh filename="extract_dates.dat" # IFS= 避免行首/尾空格被截断,-r 避免转义字符被解析 while IFS= read -r line; do # 替换当前行所有的-为空格 processed_line=$(echo "$line" | tr '-' ' ') # 输出处理后的内容 echo "$processed_line" done < "$filename"
运行以上任意一种方式,都能得到你想要的结果:2017 03 23 2018 01 23 2017 07 31
内容的提问来源于stack exchange,提问作者aloha
相关产品推荐
相关产品推荐

