単語にドットを含む完全な名前をGrepする

単語にドットを含む完全な名前をGrepする

シェル スクリプトでは、以下に示すように、特定の単語を取得するコマンドをksh使用しています。grep

$ cat file.txt
abc xyzdef.123 def.jkl mnopqrst

$ grep -o "\wdef\w" file.txt
xyzdef
def

出力xyzdef.123def.jkl

後に値を取得しません。この単語.を取得する他の方法はありますか?grepまた、正確な単語はわかりませんが、grepパターンはわかっています。kshシェルで作業しています。

答え1

def文字列とその周囲の空白以外の文字だけが必要なようです。その場合は、次を使用できます。

$ grep -Eo '\S*def\S*' file.txt 
xyzdef.123
def.jkl

\S空白以外を意味し、またはフラグのgrepいずれかを使用してGNU によってサポートされます。-E-P

答え2

grep -oPOSIX 文字クラスの使用:

grep -o '[^[:blank:]]*def[^[:blank:]]*' file.txt

これは本質的にテルドンは示唆するただし、構文が若干異なります ( は使用しません-E)。これは、文字列defとその文字列の両側にある空白以外の文字と一致します (空白以外の文字とは、スペースやタブ以外の文字のことです)。

あるいは、

tr '[:blank:]' '\n' <file | grep -F 'def'

これは、行を複数の行に分割し、1 行を空白で区切られた単語 (「空白」はタブまたはスペース文字) ごとに分割します。次に、grep -F生成された行に単純な文字列の一致を適用して、目的の行を検索します。


パターン は、\wdef\wGNU ではgrepPOSIX 文字クラス名を使用する場合 と同じであり[[:alnum:]_]def[[:alnum:]_]、文字列defの両側に英数字またはアンダースコアが付いている必要があります。ドットは英数字でもアンダースコアでもありません。

パターンは、def行の先頭または末尾に出現した場合にも一致しません。

答え3

あなたが試みた方法では、返される単語全体に一致させることはできません。-oのフラグはgrep、定義された一致した正規表現部分のみを返します。 また、 は\wの POSIX 定義の拡張機能ではなくgrep、PCRE 構文をサポートする GNU バージョンでのみ使用できる可能性があります。

grep -oP '(\w*)def[.](\w*)'

この-Pフラグは、GNU の PCRE 正規表現モードをオンにしgrep、定義された正規表現に一致する単語全体を返します。この正規表現は、0 個以上の英数字にリテラル(括弧式で囲まれたもの) が続き、その後に 0 個以上の英数字が続くもの-oと翻訳されます。def.

英数字にPOSIX文字クラスを使用するには、以下のようにします。ただし、フラグは-o依然としてGNU拡張であることに注意してください。

grep -o '\([[:alnum:]]*\)def[.]\([[:alnum:]]*\)' 

関連情報