IPアドレスを含む複数行のテキストを含むbash変数があり、同じ行にIPアドレスが最後に表示される前に「すべてのエントリ」を削除する必要があります。
これ:
43.12.40.53 [email protected]
archery-666.foobar.com 66.77.11.44 data test@example
55.32.39.153 [email protected]
5.113.30.37 dummy
89-109-22-006.static.example.com.br 89.109.22.6 [email protected]
68.28.15.55 68.28.15.55 another
次のように変換する必要があります。
43.12.40.53 [email protected]
66.77.11.44 data test@example
55.32.39.153 [email protected]
5.113.30.37 dummy
89.109.22.6 [email protected]
68.28.15.55 another
この記事を読んでください行からあるパターンの前のすべての項目と別のパターンの後のすべての項目を削除するにはどうすればよいですか?私は試した:
var=$(sed 's/^.*\(([0-9]{1,3}[\.]){3}[0-9]{1,3}\).*$/\1/' <<< "$var")
しかし、うまくいきません。
ベストアンサー1
いくつかの質問があります:
BREとEREを混合しています(
\(
たとえば、グループ化とは反対)。(
.*
IP の後のすべての内容を結果に含めるには、最後にキャプチャ グループ内になければなりません。^.*
先行するIP番号を除くすべての文字を含む可能な限り多くの文字を貪欲に消費します。
また、.
内部的にエスケープする必要もありません[]
。しかし、これは何の問題も生じません。
sed
(perl
言ったのとは異なり)貪欲でない修飾子のない(3)を処理する正しい方法はわかりません。単語境界アンカーを追加すると、機能している\b
ようですが、脆弱な感じがします。
だから(BRE)
sed 's/^.*\(\b\([0-9]\{1,3\}[.]\)\{3\}[0-9]\{1,3\}.*$\)/\1/' <<< "$var"
または (ERE)
sed -E 's/^.*(\b([0-9]{1,3}[.]){3}[0-9]{1,3}.*$)/\1/' <<< "$var"