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

如何用Bash提取指定路径下的TXT文件名?

解决方法

原命令的问题在于sed的贪婪匹配:.*会从第一个my-repo/text/开始,一直匹配到整个字符串中最后一个.txt前的内容,导致整个行只被替换一次,最终只保留最后一个文件名。

以下是几种可行的解决方式:

方法1:拆分路径为单行处理(最直观)

先把空格分隔的路径拆成每行一个,用sed提取匹配的文件名后再合并:

echo "my-repo/text/level1_dir/der.txt my-repo/scripts/af.py my-repo/text/level1_dir/another/er_abc.txt my-repo/text/deep/nested/my-file.txt" | tr ' ' '\n' | sed -nE 's|my-repo/text/.*/([^/]+)\.txt|\1|p' | tr '\n' ' ' && echo
  • tr ' ' '\n':把空格替换成换行,每个路径单独一行
  • sed -nE 's|...|\1|p':只输出匹配my-repo/text/.../*.txt的行,提取文件名
  • tr '\n' ' ' && echo:把换行换回空格,并添加结尾换行

方法2:用awk遍历字段处理

直接用awk逐个检查每个路径字段,提取符合要求的文件名:

echo "my-repo/text/level1_dir/der.txt my-repo/scripts/af.py my-repo/text/level1_dir/another/er_abc.txt my-repo/text/deep/nested/my-file.txt" | awk '{
    for(i=1;i<=NF;i++){
        if($i ~ /my-repo\/text\/.*\.txt/){
            sub(/.*\//, "", $i);
            sub(/\.txt/, "", $i);
            printf "%s ", $i
        }
    }
}' && echo
  • 遍历每个空格分隔的字段
  • 匹配目标路径格式后,去掉目录前缀和.txt后缀
  • 打印所有符合条件的文件名

方法3:修改sed匹配规则(单行处理)

调整sed的匹配模式,避免贪婪匹配覆盖多个路径:

echo "my-repo/text/level1_dir/der.txt my-repo/scripts/af.py my-repo/text/level1_dir/another/er_abc.txt my-repo/text/deep/nested/my-file.txt" | sed -E '
    s/(^| )my-repo\/text\/.*\/([^\/]+)\.txt/\1\2/g;
    s/(^| )[^ ]+\.py//g;
    s/^ //;
    s/ $//
'
  • 逐个匹配每个以空格或行首开头的目标路径,替换为文件名
  • 移除.py路径
  • 清理首尾多余空格

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 09:35:54