我试图编写一个shell脚本来检查文件中是否存在两个字符串,同时,我还要检查它们是否按特定顺序排列。
让我们说file.txt
有以下文字:
bcd
def
abc
我使用命令:grep -q abc file.txt && grep -l bcd file.txt
当两个字符串以任何顺序出现时,这将给出输出file.txt
。我希望仅在abc
出现在bcd
之前才能获得输出。请帮帮我这个
答案 0 :(得分:3)
使用 grep PCRE 选项:
grep -Pzl 'abc[\s\S]*bcd' file.txt
-z
- 将输入和输出数据视为行序列,每行以零字节(ASCII NUL字符)而不是换行符结束。如果您不支持 PCRE (-P
选项):
grep -zl 'abc.*bcd' file.txt
答案 1 :(得分:2)
awk
之后,您可以使用grep
代替abc
来匹配bcd
:
awk '/abc/{p=NR} p && /bcd/{print FILENAME; exit}' file
答案 2 :(得分:1)
awk -v RS='' '/abc.*bcd/{print FILENAME}' file.txt
您可以将RS(记录分隔符)从默认'\n'
重新分配到''
,并开始处理整个文件,因为它在一条记录中。那么使用/abc.*bcd/
来区分abc
是否领先bcd
是没有问题的。
注意,如果空行是空的,则无法成功识别,因为abc
和bcd
之间的空行会将它们拆分为不同的记录。这会导致标准误判。