如何用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
相关产品推荐
相关产品推荐

