使用sed移除find结果中文件扩展名时遇正则未终止错误求助
解决sed替换错误+优化.sh文件名提取方法
嘿,我来帮你搞定这个问题!
首先说你遇到的sed错误原因:你写的sed "s/.sh/ "犯了两个小问题:
- sed的
s替换命令必须遵循s/匹配项/替换项/的格式,最后那个结尾斜杠是必填的,你少了它,sed就会认为命令没写完,所以抛出unterminated substitute的错误。 - 你想把
.sh扩展名替换为空,但这里写了空格,最后会得到带空格的文件名,这应该不是你想要的。
另外补充个小细节:正则里的.代表任意字符,直接写.sh可能会误匹配文件名里的类似xsh的部分,最好转义成\.sh,再加上$匹配行尾,确保只替换结尾的.sh后缀。
下面给你几个可行的解决方法,从简单到健壮:
方法1:修正sed命令
把sed部分改成标准格式,就能得到正确结果:
find . -type f -name "*.sh" -exec basename {} \; | sed 's/\.sh$//'
方法2:用basename自带功能(最简洁)
其实basename本身就支持直接去掉指定后缀,完全不用sed,效率更高:
find . -type f -name "*.sh" -exec basename {} .sh \;
这里第二个参数.sh就是告诉basename:把文件名结尾的这个后缀去掉。
方法3:处理带特殊字符的文件名(最健壮)
如果你的.sh文件名里包含空格、换行或者其他特殊字符,上面的方法可能会出问题,这时候用find -print0配合xargs -0来避免分隔符错误:
find . -type f -name "*.sh" -print0 | xargs -0 basename -s .sh
-print0让find用null字符分隔文件名,xargs -0对应读取这种格式,basename -s .sh指定要移除的后缀。
内容的提问来源于stack exchange,提问作者Gabe Spound
相关产品推荐
相关产品推荐

