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也谢谢您,您可以将此作为答案发布,我将对此进行投票。