我正在寻找一个 grep 命令来搜索包含字母 q 且后面不直接跟着 au 的所有单词/字符串。
grep 'q!u' file
答案1
Linux 上的GNUgrep
实现grep
能够使用 PCRE 风格的“否定前瞻断言”。 PCRE 是“Perl 兼容正则表达式”的缩写。这些是标准 POSIX 正则表达式的扩展,您想要执行的操作的语法如下所示
q(?!u)
使用 GNU grep
:
grep -P 'q(?!u)' file
将找到包含 aq
且后面没有(直接)跟随 a 的所有行u
。
有关 PCRE 环视断言的更多信息可以在以下位置找到:
POSIX 标准正则表达式可以使用
q[^u]
即,“aq
后面(直接)跟着不是 a 的东西u
”。然而,这种模式也匹配非u
字符,而具有负前瞻的表达式与 后的字符不匹配q
。例如,这意味着上面的表达式不会匹配q
行尾的 a。为此,您可以使用
q([^u]|$)
这是一个扩展的正则表达式(使用grep
with-E
来实现)。
至于你的“单词/字符串”:A单词是一串单词字符,通常是字符匹配[[:alpha:]]
。 A细绳是任何细绳。q(?!u)
顶部的表达式将匹配任何字符串包含 aq
后没有(直接)跟随 a u
。
匹配字包含 aq
但不包含序列qu
,你可以这样做
grep -P -o -w '[[:alpha:]]*q(?!u)[[:alpha:]]*'
即(仅)提取所有包含 aq
后不跟有 a 的完整单词u
,或者您可以分两步完成:
grep -o -w '[[:alpha:]]*q[[:alpha:]]*' | grep -v qu
这个不需要 PCRE (因此不需要-P
)并且会得到所有包含 a 的单词q
,然后消除(与第二个grep
)包含的单词qu
。
例子:
$ grep -o -w '[[:alpha:]]*q[[:alpha:]]*' /usr/share/dict/words | grep -v qu
Iraq
Iraqi
Iraqian
Louiqa
miqra
nastaliq
Pontacq
q
qasida
qere
qeri
qintar
qoph
Saqib
shoq
Tareq
PCRE 变体还会返回,zaqqum
因为它包含q
后面不跟有u
.
无论采用哪种方式,都取决于您的数据是什么样子以及您实际想要匹配的内容。
答案2
我已经通过下面的 awk 命令完成了
示例文件
prqrtwtw
ahayqlo
prasqu
预期产出
prqrtwtw
ahayqlo
命令:
k=`awk -F "" '{print NF}' examplefile | sort -nr | sed -n '1p'`
for ((i=1;i<=$k;i++))
> do
> awk -v i="$i" -F "" '$i=="q" && $(i+1) !="u" {print $0}' examplefile;done
output
prqrtwtw
ahayqlo