シェルスクリプトでは、以下のように特定の単語を取得するためにコマンドを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
空白ではなく GNU パスまたはフラグの\S
サポートを示します。grep
-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
-o
def
.
以下では、POSIX文字クラスを使用して英数字を表します。しかし、このフラグは-o
まだGNU拡張であることを覚えておいてください。
grep -o '\([[:alnum:]]*\)def[.]\([[:alnum:]]*\)'