在 bash 脚本中,我正在构建两个动态数组。我想构造另一个相差两个的数组。
例子:
array1=("aa-1234|safsf|sfsfs" "aa-2345|sfsfs|n0sfm" "aa-0890|ssfsf|sfss" "aa-8097|fsfsf|fsfs" "bb-1234|xvxx|xvxv" "cc-1234|jmsf|sfsfs" "cc-1235|xvxv|xvxv")
array2=(aa-1234 aa-8097)
array1 元素是长条目,|
每个条目都作为分隔符。
现在我想构造一个array3,它的元素除了array2中匹配的之外都是array1的。
我尝试了一个for
循环来跳过元素。然而 array1 很长,需要花费太多时间。我正在寻找一种更有效的方法。
答案1
我将从第二个数组构造一个正则表达式,然后将第一个数组的元素与它进行比较:
$ re=$(IFS='|'; echo "^(${array2[*]})\|")
$ echo "$re"
^(aa-1234|aa-8097)\|
$ for elem in "${array1[@]}"; do if [[ $elem =~ $re ]]; then array3+=("$elem"); fi; done
$ printf "%s\n" "${array3[@]}"
aa-1234|safsf|sfsfs
aa-8097|fsfsf|fsfs
如果数组比显示的大得多,我会将练习分配给grep
$ grep -Ff <(printf "%s\n" "${array2[@]}") <(printf "%s\n" "${array1[@]}")
aa-1234|safsf|sfsfs
aa-8097|fsfsf|fsfs