
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"
答え2
最初の角かっこを正しくエスケープしましたが、2番目の角かっこまたは{}
エスケープする必要がある角かっこは正しくエスケープしませんでした。また、.*$
不要な行の最後まで()までのすべての項目を一致させます。正規表現を使用すると、目的のアクションが実行されます。
$ sed 's/^.*\(\([0-9]\{1,3\}[\.]\)\{3\}[0-9]\{1,3\}\)/\1/' <<< "$var"
3.12.40.53 [email protected]
6.77.11.44 data test@example
5.32.39.153 [email protected]
5.113.30.37 dummy
9.109.22.6 [email protected]
8.28.15.55 another
しかし、これはまだ必要以上に複雑です。たとえば、必要ではなく、[\.]
単純なもので\.
十分です。この-E
フラグを使用すると、拡張正規表現を有効にして構文を簡素化できます。
$ sed -E 's/^.*(([0-9]{1,3}\.){3}[0-9]{1,3})/\1/' <<< "$var"
3.12.40.53 [email protected]
6.77.11.44 data test@example
5.32.39.153 [email protected]
5.113.30.37 dummy
9.109.22.6 [email protected]
8.28.15.55 another
しかし、スチールドライバーが指摘したように、、プリアンブルは.*
予想以上に消費する可能性があるため、Perlですべての操作を実行する方が安全です。
$ perl -pe 's/^.*?(([\d]{1,3}\.){3}\d{1,3})/\1/' <<< "$var"
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 68.28.15.55 another