Linux 从阵列中删除元素以匹配文件中的模式

Linux 从阵列中删除元素以匹配文件中的模式,linux,bash,Linux,Bash,我正在尝试构建一个函数: 获取参数并将其分配给数组 删除与排除文件相匹配的所有元素 排除文件是一个文本文件,其中包含要排除的字符串列表,以行分隔 例如: 排除文件是:list.txt。 它包括: 价值1 价值2 假设我们使用以下参数调用函数: Function value1 value2 value3 所需的输出将是: 价值3 到目前为止,我试图遍历list.txt,并用array减去文件中的字符串覆盖数组。但它似乎并没有覆盖数组,而是附加值 我现在得到的结果是: 值3值2值3 我的代码是

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

  • 获取参数并将其分配给数组
  • 删除与排除文件相匹配的所有元素
排除文件是一个文本文件,其中包含要排除的字符串列表,以行分隔

例如:

排除文件是:
list.txt
。 它包括:

价值1

价值2

假设我们使用以下参数调用函数:

Function value1 value2 value3
所需的输出将是:

价值3

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

我现在得到的结果是:

值3值2值3

我的代码是:

function Function {
    argsArr=( "$@" )
    while read p; do
        argsArr="${argsArr[@]//$p*/}"
    done <list.txt
    echo "${argsArr[@]}"
}
函数{
argsArr=(“$@”)
边读边做
argsArr=“${argsArr[@]/$p*/}”

完成一个简单的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
(排除文件)中对该参数进行grep,如果退出代码为非0即不存在,则只需打印出来

如果要在数组中声明结果,请在函数开始时使用
array=()
,只需将参数附加到如下数组:
fgrep-q“$i”list.txt | | array+=(“$i”)
,在函数结束时只需执行
echo${array[@]}

编辑1:仅使用数组

$ function Function
> {
> declare -a array=()
> for i in "$@"
> do
> fgrep -q "$i" list.txt || array+=("$i")
> done
> echo "${array[@]}"
> }
$ Function value1 value2 value3
value3
$
查看第4行:

function Function {

    argsArr=( "$@" )
    while read p; do
        argsArr=(${argsArr[@]/$p*/})
    done <list.txt
    echo "${argsArr[@]}"
}
函数{
argsArr=(“$@”)
边读边做
argsArr=(${argsArr[@]/$p*/})

完成您的代码是正确的,唯一的更改是将第4行中的“”(双引号)替换为大括号()。它应该可以工作。我已经测试并发现它可以工作。删除第4行中$p之前的额外斜杠。@Koushik也谢谢您,您可以将此作为答案发布,我将对此进行投票。