首页 > 解决方案 > 如何从数组中删除以特定字符结尾的所有字符串

问题描述

我有一个数组,其中包含不同级别目录中的文件路径列表。我想将该数组过滤为仅文件,这意味着那些以 an 结尾的文件/应保留在数组中。我的文件系统上的所有路径都不是真正的路径,我可以使用操作系统工具检查目录/文件的类型。

我有一个包含以下字符串的数组:

file-a
dir/
dir/file-b
dir/dir-2/
dir/dir-2/file-c

并希望将其过滤为以下字符串(无目录):

file-a
dir/file-b
dir/dir-2/file-c

我尝试了以下方法,但删除了包括 a 在内的所有路径/,从而file-a成为唯一的剩余路径。

FILES_ARRAY=( ${FILES_ARRAY[@]//*\/} )

我尝试添加一个$(在正则表达式语法中很常见)来表示不会从数组中删除任何内容的结尾。

FILES_ARRAY=( ${FILES_ARRAY[@]//*\$/} )

标签: arraysbashglobend-of-line

解决方案


两种不同的解决方案,具体取决于filter含义:

1 - 从数组中删除目录条目:

declare -a FILES_ARRAY=([0]="file-a" [1]="dir/" [2]="dir/file-b" [3]="dir/dir-2/" [4]="dir/dir-2/file-c")
echo "++++++++++++++ array - before"
printf "%s\n" ${FILES_ARRAY[@]}

for i in ${!FILES_ARRAY[@]}
do
    [[ "${FILES_ARRAY[${i}]}" == */ ]] && unset FILES_ARRAY[${i}]       # remove directory from array
done

echo "++++++++++++++ array - after"
printf "%s\n" ${FILES_ARRAY[@]}

这会产生:

++++++++++++++ array - before
file-a
dir/
dir/file-b
dir/dir-2/
dir/dir-2/file-c
++++++++++++++ array - after
file-a
dir/file-b
dir/dir-2/file-c

2 - 将目录条目保留在数组中但不显示它们;for我们可以通过改变循环体来重新使用上面的代码:

declare -a FILES_ARRAY=([0]="file-a" [1]="dir/" [2]="dir/file-b" [3]="dir/dir-2/" [4]="dir/dir-2/file-c")
echo "++++++++++++++ array"
printf "%s\n" ${FILES_ARRAY[@]}

echo "++++++++++++++ display"
for i in ${!FILES_ARRAY[@]}
do
    [[ "${FILES_ARRAY[${i}]}" != */ ]] && echo "${FILES_ARRAY[${i}]}"   # only display non-directory entries
done

这也会产生:

++++++++++++++ array
file-a
dir/
dir/file-b
dir/dir-2/
dir/dir-2/file-c
++++++++++++++ display
file-a
dir/file-b
dir/dir-2/file-c

推荐阅读