単語にドットを含む 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

空白ではなく GNU パスまたはフラグの\Sサポートを示します。grep-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のパターンgrepはPOSIX文字クラス名を使用するのと同じで、文字列の両側に英数字または下線が[[:alnum:]_]def[[:alnum:]_]必要です。defドットは英数字でもアンダースコアでもありません。

defパターンが行の先頭または末尾に表示された場合、一致しません。

答え3

試してみると、返したい単語全体を一致させることはできません。フラグは、-o定義された一致grep正規表現の一部のみを返します。また、\wPOSIX 定義拡張ではなく、grepPCRE 構文をサポートする GNU バージョンでのみ使用できます。あなたができること

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

このフラグは-PGNUでPCRE正規表現モードをオンにし、定義された正規表現に一致するフルワードを返します。正規表現は、一致するゼロ個以上の英数字文字、その後にリテラル(角括弧式で囲まれた)、ゼロ個以上の英数字が続くものに変換されます。grep-odef.

以下では、POSIX文字クラスを使用して英数字を表します。しかし、このフラグは-oまだGNU拡張であることを覚えておいてください。

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

関連情報