Ubuntu系统下使用Sed插入文件路径遇语法错误求助
解决Sed替换时因路径含斜杠导致的"unknown option to
s"错误 嘿,这个问题我太熟了!你遇到的报错完全是因为路径里的斜杠和sed替换命令的分隔符冲突了——听我给你拆解清楚:
问题根源
你用的sed命令是:
blendpath="/home/weather/data/arc/" sed "s/^arc1.4x_os/'\''open '${blendpath}'arc1.4x_os/g"
sed的s命令默认用/作为分隔符,当${blendpath}展开成/home/weather/data/arc/后,命令里会出现一堆额外的/,sed直接懵了:它会把第一个/当成分隔符,后面的home就变成了未知的选项,自然就抛出sed: -e expression #1, char 20: unknown option to s'`这个错误。
另外你命令里的'\''其实是多余的,双引号里直接写'open 就能正确输出开头的单引号,不用绕弯子。
两种快速解决方案
方案1:更换sed的分隔符(推荐)
找一个不在你的路径和目标字符串里的字符当分隔符,比如#、|或者@,这样就不会和路径里的/冲突了。比如用#的话,命令可以改成这样:
# 先定义变量,再执行sed(更清晰) blendpath="/home/weather/data/arc/" sed "s#^arc1.4x_os#'open ${blendpath}arc1.4x_os#g" 你的文件名.txt
如果需要输出结尾也带单引号,就把替换后的部分改成'open ${blendpath}arc1.4x_os',命令变成:
sed "s#^arc1.4x_os#'open ${blendpath}arc1.4x_os'#g" 你的文件名.txt
这样就能得到你想要的'open /home/weather/data/arc/arc1.4x_os'结果。
方案2:转义路径里的斜杠
如果你非要用/当分隔符,那就得把路径里的每个/都转义成\/,但这种方法比较繁琐:
blendpath="/home/weather/data/arc/" # 转义路径里的斜杠 blendpath_escaped=$(echo "$blendpath" | sed 's/\//\\\//g') # 再执行替换 sed "s/^arc1.4x_os/'open ${blendpath_escaped}arc1.4x_os/g" 你的文件名.txt
显然方案1更省心,谁没事愿意手动转义一堆斜杠呢😉
内容的提问来源于stack exchange,提问作者arnpry
相关产品推荐
相关产品推荐

