私は文字qを含み、直後にauが来ないすべての単語/文字列を検索するgrepコマンドを探しています。
grep 'q!u' file
答え1
LinuxのGNUgrep
実装では、grep
PCREスタイルの「否定予測アサーション」を使用できます。 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
。たとえば、これは上記の式が行末のq
aと一致しないことを意味します。これには、次のものを使用できます。
q([^u]|$)
これは拡張正規表現です(grep
withを使用して実装されています-E
)。
「単語/文字列」の場合:A言葉文字列です単語文字、通常は文字一致です[[:alpha:]]
。 ㅏひもはいどのひも。q(?!u)
上の表現が一致します。ランダムな文字列q
。後ろに(直接)なしが含まれていますu
。
マッチ性格aを含めますq
が、シーケンスは含まず、次のことがqu
できます。
grep -P -o -w '[[:alpha:]]*q(?!u)[[:alpha:]]*'
q
つまり、(のみ)の後にaを含む完全な単語をすべて抽出するか、u
2つのステップで実行できます。
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バリアントも返されます。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