aqを含めて後ろにauが来ない単語/文字列を探す

aqを含めて後ろにauが来ない単語/文字列を探す

私は文字qを含み、直後にauが来ないすべての単語/文字列を検索するgrepコマンドを探しています。

grep 'q!u' file

答え1

LinuxのGNUgrep実装では、grepPCREスタイルの「否定予測アサーション」を使用できます。 PCREは「Perl Compatible Regular Expressions」の略です。これは標準のPOSIX正規表現の拡張であり、実行したい構文は次のとおりです。

q(?!u)

GNUの使用grep:

grep -P 'q(?!u)' file

qは(直接)の後にaが出ないaを含むすべての行を探しますu

PCREナビゲーションアサーションの詳細については、以下を参照してください。


POSIX 標準正規表現を使用できます。

q[^u]

つまり、「aのq後にはaではないものが(直接)来ますu。」しかし、このモデルはu文字以外の文字も一致します。一方、否定予測を含む式は次の文字と一致しませんq。たとえば、これは上記の式が行末のqaと一致しないことを意味します。これには、次のものを使用できます。

q([^u]|$)

これは拡張正規表現です(grepwithを使用して実装されています-E)。


「単語/文字列」の場合:A言葉文字列です単語文字、通常は文字一致です[[:alpha:]]。 ㅏひもはいどのひも。q(?!u)上の表現が一致します。ランダムな文字列q。後ろに(直接)なしが含まれていますu

マッチ性格aを含めますqが、シーケンスは含まず、次のことがquできます。

grep -P -o -w '[[:alpha:]]*q(?!u)[[:alpha:]]*'

qつまり、(のみ)の後にaを含む完全な単語をすべて抽出するか、u2つのステップで実行できます。

grep -o -w '[[:alpha:]]*q[[:alpha:]]*' | grep -v qu

これはPCREを必要とせず(したがって不要-P)、aを含むすべての単語を取得しq削除する(2番目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

後にnotがzaqqum含まれているため、PCREバリアントも返されます。qu

どちらもデータの外観と実際に一致させたい内容によって異なります。

答え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

関連情報