按元素属性从bash数组中删除元素

时间:2017-05-11 04:37:53

标签: arrays bash

在bash中,如果我有一个文件名数组,我从这样的文件中检索:

readarray files < $MY_DIR/my_file_list.cfg

如何删除数组files中长度少于四个字符的所有元素?

2 个答案:

答案 0 :(得分:2)

循环关于数组的每个元素并检查其元素长度并在必要时删除元素。

for ((i=0;i<=${#files[@]};i++)); do
  [[ ${#files[$i]} -lt 4 ]] && unset files[$i]
done

declare -p
  

${#files[@]}:数组files

中的元素数量      

${#files[$i]}:元素$i的长度

     

-lt:算术测试小于

答案 1 :(得分:1)

使用bash 子字符串扩展测试代码:

printf "abc\nabcdefg\na\nabcd\n" | while read x ; do [ "${x:4}" ] && echo $x ; done

输出:

abcdefg
abcd

因此:

  1. bash代码:

    readarray files < <(while read x ; do [ "${x:4}" ] && echo $x ; done < \
                           $MY_DIR/my_file_list.cfg )
    
  2. 更简单的grep辅助代码:

    readarray files < <(grep '^....' $MY_DIR/my_file_list.cfg)
    
  3. 这些方法在太短的条目上不会浪费数组内存。最糟糕的情况是,如果 my_file_list.cfg 只包含一个长名称,而是包含数十亿个短名称。 (数十亿个短名称可能耗尽bash的记忆,或至少导致交换或颠簸。)

相关问题