在bash中搜索子字符串匹配的最有效方法是什么?

时间:2017-04-06 15:09:45

标签: bash

我有一个带噪音的名字列表和一个干净的名字列表,我确信干净的名字是带噪音的名字的精确子串。

假设我们有一个带噪音的名称,例如var?goldenfoo,我想从文本文件cleannames输出,看起来像这样

golden
blue
red

golden

我曾尝试将grep用于cat ed cleannames,但这似乎相当不合理。

3 个答案:

答案 0 :(得分:1)

尝试:

grep -Fof cleannames.txt text.txt

如果您想要其他内容,只需编辑您的问题并添加更多详细信息。 :)

让我们说:

  

诺维斯的Impedit quas et totam。 Voluptas repellat voluptas possimus   rerum est golden nihil。 Et ut minima坐下。 Quia accusamus rerum   voluptate。 Dolores molestiae非dolorem dignissimos quaerat magni。   Quia reiciendis cupi golden ditation quo hic doloremque molestiae。奥迪奥   odio quis est quisquam eligendi esse。自然中的自由建筑师   dolorum eveniet。 Modi error dolorum voluptas ul red lam aut。 Soluta   veniam corporis est.Illum maxime golden perferendis incidunt qui   consequatur。 Laborum quia ab voluptatem。

将打印

golden
golden
red
golden

echo 'var?goldenfoo' | grep -Fof cleannames.txt

将打印

golden

clean=(golden red blue)  #or read into array from a file...
text='var?goldenfoo'

grep -Fof <(printf "%s\n" "${clean[@]}") <<< "$text"

打印

golden

因此您可以代替cleannames.txt进行任何进程替换,而不是text.txt您可以进行任何重定向。任何组合都可以。

答案 1 :(得分:0)

您可以使用mapfile保持数组中的干净名称:

mapfile -t ary < cleannames

然后使用这样的搜索功能:

srch() { for i in "${ary[@]}"; do [[ $1 == *"$i"* ]] && echo "$i"; done; }

然后将其调用为:

srch 'var?goldenfoo'
golden

srch 'foobar?bluebox'
blue

答案 2 :(得分:0)

如果你想比grep搜索更快,你应该给予 Silver Searcher一试。