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

标签 linux bash

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

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

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

例如:

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

value1

value2

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

Function value1 value2 value3

期望的输出是:

value3

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

我现在得到的输出是:

value3 value2 value3

我的代码是:

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

最佳答案

一个简单的 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"列表.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
$

关于linux - 从文件中匹配模式的数组中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36032037/

相关文章:

c - 为什么它在 execlp 之后不返回?正常吗?

bash - bash rm -rf!上的语法错误意外的标记

bash - "[ $(command) ]"什么时候等于 "if command; then..."?

bash - 对于带空格键的文件,重命名命令不会在两步命令中重命名(mac 终端)

bash - 为什么我要在 shell 脚本中使用 declare/typeset 而不是 X=y?

linux - 运行 bash 脚本,在启动时自动打开终端

linux - 如何比较两个未排序且行略有不同的文本文件

linux - 从已编译的 bash 脚本中检索纯文本脚本

python - Python如何处理systemctl停止?

linux - 在 bash 中对 "key/value pair"数组进行排序