查找包含 aq 且后面不跟 au 的单词/字符串

查找包含 aq 且后面不跟 au 的单词/字符串

我正在寻找一个 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]|$)

这是一个扩展的正则表达式(使用grepwith-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

相关内容