从与文件匹配模式的数组中删除元素

时间:2016-03-16 09:49:21

标签: linux bash

我正在尝试构建一个函数:

  • 获取参数并将它们分配给数组。
  • 删除与排除文件匹配的所有元素。

排除文件是一个文本文件,其中包含要用行分隔的要排除的字符串列表。

例如:

排除文件为:list.txt。 它包含:

  

值1

     

值2

假设我们用这些参数调用函数:

Function value1 value2 value3

所需的输出是:

  

值3

到目前为止,我试图遍历list.txt并用数组覆盖数组,减去文件中的String。但似乎它不会覆盖数组,而是附加值。

我现在得到的输出是:

  

value3 value2 value3

我的代码是:

function Function {
    argsArr=( "$@" )
    while read p; do
        argsArr="${argsArr[@]//$p*/}"
    done <list.txt
    echo "${argsArr[@]}"
}

2 个答案:

答案 0 :(得分:2)

一个简单的grep检查就足够了:

$ cat list.txt 
value1
value2
$ function Function
> {
> for i in "$@"
> do
> fgrep -q "$i" list.txt || echo "$i"
> done
> }
$ Function value1 value2 value3
value3
$

我们只是在list.txt(排除文件)中迭代传递给function和grep的参数,如果退出代码不为0,即不存在,那么我们只需将其打印出来。

如果你想把结果放在数组中,使用array=()在函数的开头声明它,只需将参数附加到这样的数组:fgrep -q "$i" list.txt || array+=("$i")并在函数的末尾只做{{1 }}

编辑1:只使用数组

echo ${array[@]}

答案 1 :(得分:1)

查看第4行:

function Function {

    argsArr=( "$@" )
    while read p; do
        argsArr=(${argsArr[@]/$p*/})
    done <list.txt
    echo "${argsArr[@]}"
}