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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:06:56