获取一个正则表达式文件并返回另一个文件中每个正则表达式的第一个匹配项

获取一个正则表达式文件并返回另一个文件中每个正则表达式的第一个匹配项

我有两个文件。a.txt有一个正则表达式列表,以换行符分隔。b.txt有行,其中一些与中的正则表达式匹配a.txt

我想要的是:一个命令(可能是 grep),它将获取两个文件,并为 中的每一行a.txt打印 中的第一个整行匹配项b.txt。理想的解决方案还将正则表达式本身打印为前缀,如果没有匹配项,则打印“不匹配”或其他独特的内容。但是,缺少其中一个或两个就足够了。

我目前正在使用什么来测试解决方案:

文本文件:

[abc]*qs
ab[cqs]*
w+x+

文本文件:

aqs
abqs
abs

我尝试过的最好的东西是grep -xf a.txt b.txt,打印

aqs
abqs
abs

grep -xcf a.txt b.txt打印3

理想的输出是

[abc]*qs aqs
ab[cqs]* abqs
w+x+ None

最低可接受的输出是

aqs
abqs

答案1

while read -r pattern; do
   printf '%s ' "$pattern"
   grep -x -m 1 "$pattern" b.txt || printf '%s\n' 'None'
done <a.txt

它的工作原理是逐个读取模式,grep对每个模式运行,并printf在需要时打印()附加信息。

注意:grep -m 1找到第一个匹配项后停止,但这不是 POSIX。如果您没有此选项,请将grep包含以下内容的行替换为:

{ grep -x "$pattern" b.txt || printf '%s\n' 'None'; } | head -n 1

相关内容