Bash
如何在bash變數中每行出現正則表達式模式之前刪除所有內容
我有一個包含多行文本的 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")
但它不起作用。
幾個問題:
- 您正在混合 BRE 和 ERE(例如
\(
與(
分組相比)- 如果您希望結果包含 IP 之後的所有內容,您
.*
最後需要在擷取組內^.*
開頭將貪婪地消耗盡可能多的字元 - 包括除一個前導 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"