ksh
シェルスクリプトでは、以下に示すようにgrep
コマンドを使用して特定のWordを取得しています。
$ cat file.txt
abc xyzdef.123 def.jkl mnopqrst
$ grep -o "\wdef\w" file.txt
xyzdef
def
出力をxyzdef.123
とdef.jkl
にしたい
.
の後に値をフェッチしていません。このWordをgrep
する他の方法はありますか?また、grep
への正確なWordもわかりません。パターンを知っているだけです。 ksh
Shellに取り組んでいます。
文字列def
とその周りのすべての非空白文字が必要なようです。もしそうなら、あなたは使用することができます:
$ grep -Eo '\S*def\S*' file.txt
xyzdef.123
def.jkl
\S
は非空白文字を意味し、GNU grep
と-E
または-P
フラグ。
grep -o
およびPOSIX文字クラスの使用:
grep -o '[^[:blank:]]*def[^[:blank:]]*' file.txt
これは本質的には terdonが示唆する ですが、構文は少し異なります(-E
は使用しません)。これは、文字列def
と、その文字列の両側にある空白以外の文字と一致します(空白以外の文字は、スペースまたはタブではない文字です)。
または、
tr '[:blank:]' '\n' <file | grep -F 'def'
これは、行を複数行に分割するだけです。空白で区切られたWordごとに1行です(「空白」はタブまたはスペース文字です)。次に、生成された行にgrep -F
とのプレーンストリングマッチを適用して、関心のある行を見つけます。
パターン\wdef\w
は、GNU grep
で、POSIX文字クラス名を使用している場合は[[:alnum:]_]def[[:alnum:]_]
と同じであり、文字列def
の横に英数字が必要です。文字またはアンダースコア(両側)ドットは、英数字でもアンダースコアでもありません。
また、パターンは、行の最初または最後にある場合、def
には一致しません。
あなたが試みた場合、返されるWord全体を照合することはできません。 grep
の-o
フラグは、定義された一致した正規表現部分のみを返します。また、\w
はgrep
のPOSIX定義の拡張機能ではなく、PCRE構文をサポートするGNUバージョンでのみ使用できる可能性があります。
grep -oP '(\w*)def[.](\w*)'
-P
フラグはGNU grep
でPCRE正規表現モードをオンにし、-o
フラグは定義された正規表現に一致する単語全体を返します。 0個以上の英数字に一致し、その後にdef
とリテラル.
(括弧式で囲まれている)が続き、その後に0個以上の英数字が続くものとして変換されます。
英数字のPOSIX文字クラスを使用すると、以下のようになります。ただし、フラグ-o
はまだGNU拡張子)であることを忘れないでください
grep -o '\([[:alnum:]]*\)def[.]\([[:alnum:]]*\)'