![単語にドットを含む完全な名前をGrepする](https://rvso.com/image/154442/%E5%8D%98%E8%AA%9E%E3%81%AB%E3%83%89%E3%83%83%E3%83%88%E3%82%92%E5%90%AB%E3%82%80%E5%AE%8C%E5%85%A8%E3%81%AA%E5%90%8D%E5%89%8D%E3%82%92Grep%E3%81%99%E3%82%8B.png)
シェル スクリプトでは、以下に示すように、特定の単語を取得するコマンドをksh
使用しています。grep
$ cat file.txt
abc xyzdef.123 def.jkl mnopqrst
$ grep -o "\wdef\w" file.txt
xyzdef
def
出力xyzdef.123
はdef.jkl
後に値を取得しません。この単語.
を取得する他の方法はありますか?grep
また、正確な単語はわかりませんが、grep
パターンはわかっています。ksh
シェルで作業しています。
答え1
def
文字列とその周囲の空白以外の文字だけが必要なようです。その場合は、次を使用できます。
$ grep -Eo '\S*def\S*' file.txt
xyzdef.123
def.jkl
は\S
空白以外を意味し、またはフラグのgrep
いずれかを使用してGNU によってサポートされます。-E
-P
答え2
grep -o
POSIX 文字クラスの使用:
grep -o '[^[:blank:]]*def[^[:blank:]]*' file.txt
これは本質的にテルドンは示唆するただし、構文が若干異なります ( は使用しません-E
)。これは、文字列def
とその文字列の両側にある空白以外の文字と一致します (空白以外の文字とは、スペースやタブ以外の文字のことです)。
あるいは、
tr '[:blank:]' '\n' <file | grep -F 'def'
これは、行を複数の行に分割し、1 行を空白で区切られた単語 (「空白」はタブまたはスペース文字) ごとに分割します。次に、grep -F
生成された行に単純な文字列の一致を適用して、目的の行を検索します。
パターン は、\wdef\w
GNU ではgrep
POSIX 文字クラス名を使用する場合 と同じであり[[: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:]]*\)'