arrays - 如何从数组中删除以特定字符结尾的所有字符串
问题描述
我有一个数组,其中包含不同级别目录中的文件路径列表。我想将该数组过滤为仅文件,这意味着那些以 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[@]//*\$/} )
解决方案
两种不同的解决方案,具体取决于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
推荐阅读
- reactjs - 尝试使用 redux 将值保存到我的商店,但它似乎不起作用
- concurrency - 如何在 fp-ts 中限制并发
- excel - Microsoft.Mashup.OleDb.1 提供程序未在本地计算机上注册
- javascript - 在没有画布的情况下获取按钮单击事件
- amazon-web-services - 通过 IAM Role 从长期运行的 ASP.NET Core 服务访问 AWS 服务
- angular - 如何根据条件使输入字段需要?
- python-3.x - 当用相同的值编辑单元格时,有没有办法发出信号?
- visual-c++ - 无法使用 ReadExisting() 保留大于 127 的字节值;
- php - 没有显示 human_time_diff 的输出
- apache-nifi - 当其中一条记录已存在于数据库中时,PutDataBaseRecord 不会插入任何记录