web-dev-qa-db-ja.com

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

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

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

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

出力をxyzdef.123def.jklにしたい

.の後に値をフェッチしていません。このWordをgrepする他の方法はありますか?また、grepへの正確なWordもわかりません。パターンを知っているだけです。 ksh Shellに取り組んでいます。

3
Arnav

文字列defとその周りのすべての非空白文字が必要なようです。もしそうなら、あなたは使用することができます:

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

\Sは非空白文字を意味し、GNU grep-Eまたは-Pフラグ。

4
terdon

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には一致しません。

4
Kusalananda

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

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

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

英数字のPOSIX文字クラスを使用すると、以下のようになります。ただし、フラグ-oはまだGNU拡張子)であることを忘れないでください

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