如何使用Bash从一组字符串B中过滤出一组字符串A.

Ily*_*uta 4 string bash filter

我有一个字符串列表,我想从另一个字符串的超集中删除,而不是以任何特定的顺序,从而构建一个新的集合.这在巴什是可行的吗?

Eva*_*all 5

看起来你正在寻找具有优于O(nm)运行时间的东西,所以这里是答案.Fgrep或grep -F使用Aho-Corasick算法从固定字符串列表中生成单个FSM,因此检查SET2中的每个字需要O(字长)时间.这意味着该脚本的整个运行时间为O(n + m).

(显然,运行时间也取决于单词的长度)

[meatmanek@yggdrasil ~]$ cat subtract.sh 
#!/bin/bash
subtract()
{
  SET1=( $1 )
  SET2=( $2 )
  OLDIFS="$IFS"
  IFS=$'\n'
  SET3=( $(grep -Fxv "${SET1[*]}" <<< "${SET2[*]}") )
  IFS="$OLDIFS"
  echo "${SET3[*]}"
  # SET3 = SET2-SET1
}
subtract "$@"
[meatmanek@yggdrasil ~]$ . subtract.sh 

[meatmanek@yggdrasil ~]$ subtract "package-x86 test0 hello world" "computer hello sizeof compiler world package-x86 rocks"
computer sizeof compiler rocks
[meatmanek@yggdrasil ~]$ 
Run Code Online (Sandbox Code Playgroud)

  • 尼斯.虽然它使用newline作为分隔符,但您也可以使用:**subtract(){fgrep -vx"$ {1 ///$'\n'}"<<<"$ {2 ///$'\n '}"; }** - 或者对于空格分隔符,使用:**subtract(){echo $(fgrep -vx"$ {1 ///$'\n'}"<<<"$ {2 ///$' \n'}"); }** (2认同)

Ada*_*ard 1

我认为您至少必须表征要提取的字符串子集的参数。但是,如果它是类似文本字段的数据,请查看 awk。