首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从数组中删除所有以特定字符结尾的字符串

如何从数组中删除所有以特定字符结尾的字符串
EN

Stack Overflow用户
提问于 2020-09-20 20:27:19
回答 3查看 73关注 0票数 1

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

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

代码语言:javascript
复制
file-a
dir/
dir/file-b
dir/dir-2/
dir/dir-2/file-c

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

代码语言:javascript
复制
file-a
dir/file-b
dir/dir-2/file-c

我尝试使用以下方法,但这会删除包括/在内的所有路径,导致file-a成为唯一剩余的路径。

代码语言:javascript
复制
FILES_ARRAY=( ${FILES_ARRAY[@]//*\/} )

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

代码语言:javascript
复制
FILES_ARRAY=( ${FILES_ARRAY[@]//*\$/} )
EN

回答 3

Stack Overflow用户

发布于 2020-09-20 23:11:25

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

1-从阵列中删除目录条目:

代码语言:javascript
复制
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[@]}

这将生成:

代码语言:javascript
复制
++++++++++++++ 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循环的主体来重用上面的代码:

代码语言:javascript
复制
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

这还会生成:

代码语言:javascript
复制
++++++++++++++ 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
票数 2
EN

Stack Overflow用户

发布于 2020-09-20 20:40:02

您可以使用

代码语言:javascript
复制
FILES_ARRAY=(file-a dir/ dir/file-b dir/dir-2/ dir/dir-2/file-c)
NEW_FILES_ARRAY=()
for (( i=0; i<${#FILES_ARRAY[@]}; i++ )); do 
  if ! [[ "${FILES_ARRAY[$i]}" == */ ]]; then
    NEW_FILES_ARRAY+=("${FILES_ARRAY[$i]}");
  fi
done
FILES_ARRAY=("${NEW_FILES_ARRAY[@]}")

printf '%s\n' ${FILES_ARRAY[@]}

输出:

代码语言:javascript
复制
file-a
dir/file-b
dir/dir-2/file-c

请参见online Bash demo

NOTES

  • for (( i=0; i<${#FILES_ARRAY[@]}; i++ )); do ... done遍历代码长度,为FILES_ARRAY分配数组的索引and
  • NEW_FILES_ARRAY+=("${FILES_ARRAY[$i]}");检查当前元素是否未以/结尾(*匹配任意数量的字符,/匹配/,全局模式总是需要整个字符串匹配,不需要代码) array.
  • FILES_ARRAY=("${NEW_FILES_ARRAY[@]}")将当前项添加到NEW_FILES_ARRAY NEW_FILES_ARRAY重新分配原始变量,以便它保存过滤后的元素

<代码>F226

票数 0
EN

Stack Overflow用户

发布于 2020-09-21 15:29:39

awk命令可能会有所帮助,但由于路径中有空格,因此它将失败

代码语言:javascript
复制
new_arr=($(awk '{for (i=1; i<=NF; i++) if ($i !~ /\/$/) {print $i}}' <<< "${arr[@]}"))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63978961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档