Bash grep命令以了解这两个字符串的具体顺序

Bash grep命令以了解这两个字符串的具体顺序,bash,shell,unix,Bash,Shell,Unix,我试图编写一个shell脚本来检查文件中是否存在两个字符串,同时,我还检查它们是否按特定顺序排列 假设file.txt包含以下文本: bcd def abc 我正在使用命令:grep-qabc file.txt&&grep-lbcd file.txt 当两个字符串以任意顺序出现时,这将给出输出file.txt。我只想在abc位于bcd之前时获得输出。请使用grepPCRE选项帮助我: -z-将输入和输出数据视为行序列,每个行以零字节(ASCII NUL字符)而不是换行符终止 如果您不支持

我试图编写一个shell脚本来检查文件中是否存在两个字符串,同时,我还检查它们是否按特定顺序排列

假设
file.txt
包含以下文本:

bcd
def
abc
我正在使用命令:
grep-qabc file.txt&&grep-lbcd file.txt

当两个字符串以任意顺序出现时,这将给出输出
file.txt
。我只想在
abc
位于
bcd
之前时获得输出。请使用grepPCRE选项帮助我:

  • -z
    -将输入和输出数据视为行序列,每个行以零字节(ASCII NUL字符)而不是换行符终止

如果您不支持PCRE(
-p
选项):

grep -zl 'abc.*bcd' file.txt

只有在
bcd
之后,才可以使用
awk
而不是
grep
来匹配
abc

awk '/abc/{p=NR} p && /bcd/{print FILENAME; exit}' file
您可以将RS(记录分隔符)从默认的
'\n'
重新分配到
'
,并开始处理整个文件,因为它位于一个记录中。那么使用
/abc.*.bcd/
来区分
abc
是否在前面就没有问题了
bcd


注意,如果出现空行,则无法成功识别,因为
abc
bcd
之间的空行会将它们分割为不同的记录。这将导致标准判断错误。

我不允许设置PCRE。它无法识别命令“P”,标志
z
也不支持该命令here@sbk:您有哪个grep(和哪个Unix?
-z
仅在
gnu grep
中受支持,它似乎可以工作。有没有办法只匹配字符串的一部分而不是整行<当我在
abc
中删除
c
时,code>awk'/ab/{p=NR}p&&&&&&&/bcd/{print FILENAME;exit}文件没有给出输出。很抱歉,在我更新的答案中应该只有一个
和&
。而且
/ab/
将匹配行中任何位置的字符串
ab
。试试这个:
awk'/ab/{p=NR}p&/bcd/{print FILENAME;exit}文件
,如果输入中有空行,它将不起作用。@anubhava,是的,你是对的。但为什么空行会使答案无效?你能给我一些提示吗?当RS设置为空字符串时,每条记录总是以遇到的第一个空行结束。理解。谢谢你。我将删除我的答案,因为它在所有情况下都不起作用。你可以保留答案,只需更新,只有在输入中没有空行时它才会起作用。
awk '/abc/{p=NR} p && /bcd/{print FILENAME; exit}' file
awk -v RS='' '/abc.*bcd/{print FILENAME}' file.txt