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

读取文件行插入分号时因特殊字符导致sed命令报错

文本插入分号时sed报错解决方法

问题场景

需求为读取文本文件每一行,在指定位置插入分号,但执行脚本后sed返回错误:sed: -e expression #1, char 75: unknown option to 's'

用户使用的Shell脚本:

while read -r line; do
 if [[ $line ==  62* ]]; then         
   newLine="${line:0:2};${line:2:7};${line:9:12};${line:22:10};${line:32:16};${line:50:1};${line:51:22};${line:73:3};${line:76:6};${line:82:1};${line:83:15};${line:98:2};${line:100:2};"
 else
   newLine="${line:0:2};${line:2:7};${line:9:6};${line:14:106};"
 fi     
 sed -i -e "s/$line/$newLine/g" $newFileName
done < $newFileName

错误原因

sed的s命令默认用/作为匹配与替换内容的分隔符,若原行($line)或新行($newLine)中包含/(比如路径、URL等),sed会误将其当成命令分隔符,导致表达式语法混乱,触发报错。

同时原脚本存在逻辑漏洞:循环读取文件的同时用sed -i修改该文件,会导致后续读取的内容是已经修改过的行,处理逻辑彻底混乱。

解决方案

方案1:更换sed分隔符+修正读写逻辑

把s命令的分隔符换成文本中未出现的字符(比如|),同时改用临时文件存储处理结果,避免边读边改的问题:

# 创建临时文件
> temp.txt

while read -r line; do
 if [[ $line == 62* ]]; then         
   newLine="${line:0:2};${line:2:7};${line:9:12};${line:22:10};${line:32:16};${line:50:1};${line:51:22};${line:73:3};${line:76:6};${line:82:1};${line:83:15};${line:98:2};${line:100:2};"
 else
   newLine="${line:0:2};${line:2:7};${line:9:6};${line:14:106};"
 fi     
 # 将处理后的行写入临时文件
 echo "$newLine" >> temp.txt
done < "$newFileName"

# 替换原文件
mv temp.txt "$newFileName"

方案2:用awk高效处理(推荐)

awk天生适合按位置截取文本的场景,无需循环调用sed,处理效率更高:

awk '{
    if ($0 ~ /^62/) {
        # awk的substr从1开始计数,对应bash的0起始位置需+1
        printf "%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;\n",
            substr($0,1,2), substr($0,3,7), substr($0,10,12), substr($0,22,10),
            substr($0,32,16), substr($0,51,1), substr($0,52,22), substr($0,74,3),
            substr($0,77,6), substr($0,83,1), substr($0,84,15), substr($0,99,2),
            substr($0,101,2)
    } else {
        printf "%s;%s;%s;%s;\n",
            substr($0,1,2), substr($0,3,7), substr($0,10,6), substr($0,16,106)
    }
}' "$newFileName" > temp.txt && mv temp.txt "$newFileName"

内容的提问来源于stack exchange,提问作者Luca Telese

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:20:35