我有两个文件。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