您可以简单地使用awk 匹配每个字段中的最后一组单词字符并输出它们,例如
awk '{for (i=1; i<=NF; i++) if ($i ~ /folderA/) { match($i,/\w+$/); print substr($i,RSTART,RLENGTH)}}' <<< $path_str
使用/输出示例
path_str="path/folderA/fileA1 path/folderA/subFolderA/fileA2 path/folderB/fileB1"
awk '{for (i=1; i<=NF; i++) if ($i ~ /folderA/) { match($i,/\w+$/); print substr($i,RSTART,RLENGTH)}}' <<< $path_str
fileA1
fileA2
您可以根据需要调整输出格式。如果您希望输出全部在一行上,或者如果您想使用 命令替换 将输出捕获到一个新数组中,这取决于您。
使用 Bash 参数扩展
如果您想使用 参数扩展 和 子字符串删除,您可以使用一个简单的循环和扩展 $(var##*/} 来删除直到最终 '/' 的所有内容从每个路径组件,例如
path_str="path/folderA/fileA1 path/folderA/subFolderA/fileA2 path/folderB/fileB1"
for i in $path_str; do
[[ $i =~ folderA ]] && echo ${i##*/}
done
fileA1
fileA2
对于您的情况,参数扩展可能是最有效的,因为它是您的 shell 的内置功能,并且可以避免产生子 shell。但是,如果您有数十万个组件,我可能会让awk 处理它。
符合 POSIX 且去除子字符串的参数扩展集是:
${var#pattern} Strip shortest match of pattern from front of $var
${var##pattern} Strip longest match of pattern from front of $var
${var%pattern} Strip shortest match of pattern from back of $var
${var%%pattern} Strip longest match of pattern from back of $var
除了 POSIX 提供的参数扩展之外,Bash 还提供了很多很多的参数扩展。包括从子字符串替换到字符大小写转换的所有内容。
如果您还有其他问题,请告诉我。