Bash

如何在bash變數中每行出現正則表達式模式之前刪除所有內容

  • July 7, 2019

我有一個包含多行文本的 bash 變數,其中包括 IP 地址,我需要在同一行中最後一個 IP 地址出現之前刪除“所有內容”。

這:

43.12.40.53 refunds@example.uk
archery-666.foobar.com  66.77.11.44 data test@example
55.32.39.153    remix@example.com
5.113.30.37 dummy
89-109-22-006.static.example.com.br 89.109.22.6 hello@example.com
68.28.15.55 68.28.15.55 another

應轉化為:

43.12.40.53 refunds@example.uk
66.77.11.44 data test@example
55.32.39.153    remix@example.com
5.113.30.37 dummy
89.109.22.6 hello@example.com
68.28.15.55 another

閱讀這篇文章如何從一行中刪除一個模式之前的所有內容以及另一個模式之後的所有內容?我試過:

var=$(sed 's/^.*\(([0-9]{1,3}[\.]){3}[0-9]{1,3}\).*$/\1/' <<< "$var")

但它不起作用。

幾個問題:

  1. 您正在混合 BRE 和 ERE(例如\((分組相比)
  2. 如果您希望結果包含 IP 之後的所有內容,您.*最後需要在擷取組內
  3. ^.*開頭將貪婪地消耗盡可能多的字元 - 包括除一個前導 IP 數字之外的所有字元

此外,.不需要在裡面逃跑[] ——儘管這不會破壞任何東西。

我不確定處理(3)的正確方法,sed其中(不像perl說)沒有非貪婪修飾符。添加一個詞邊界錨\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"

引用自:https://unix.stackexchange.com/questions/528819