sed命令报‘bad option in substitution expression’错误的解决求助
脚本修复方案
你的脚本存在几个直接导致错误的问题,以下是问题点和修复后的完整解决方案:
原脚本问题
- 语法错误:
filedate变量的赋值语句末尾缺少闭合的反引号,脚本解析时直接触发报错。 - 逻辑错位:
filename和filedate会收集所有匹配文件的结果,循环时无法将单个文件与对应的日期一一对应。 - 变量误用:循环内误用全局的
$filedate而非循环变量$i,导致所有日期被批量插入到每一行。 - 未修改文件:原
sed仅在终端输出结果,未实际修改源文件。
修复后的脚本
# 遍历所有符合条件的txt文件 find . -not -name '*Err*' -name '*202210*.txt' | while read -r filename; do # 从当前文件名提取日期部分 filedate=$(echo "$filename" | awk -F _ '{print $2,$3}' | awk -F . '{print $1}') # 将日期插入文件每一行开头,并直接修改源文件 sed -i "s/^/$filedate /" "$filename" done
关键修改说明
- 改用
while read循环遍历文件:确保每个文件单独处理,日期与文件一一绑定,避免多文件结果混乱。 - 替换反引号为
$(...):这是更现代的命令替换写法,避免嵌套时的语法问题,同时修复了原脚本的反引号未闭合错误。 - 添加
sed -i选项:让sed直接修改源文件,若需要保留原文件备份,可改为sed -i.bak,会生成带.bak后缀的备份文件。 - 变量加双引号:避免文件名包含空格或特殊字符时出现解析错误。
内容的提问来源于stack exchange,提问作者Julian Tang
相关产品推荐
相关产品推荐

