我試圖通過使用 sed 分組從字串中獲取 IP,但我無法弄清楚這有什么問題。
輸入:
echo "instream(10.20.213.11@40266):" | sed -E 's/.*([0-9] \.[0-9] \.[0-9] \.[0-9] ).*/\1/'
輸出:
0.20.213.11
為什么第一個數字不見了?
uj5u.com熱心網友回復:
您可以在隨后的數字匹配正則運算式部分之前將.*匹配貪婪地替換為.*[^0-9]需要非數字字符:
sed -E 's/.*[^0-9]([0-9] \.[0-9] \.[0-9] \.[0-9] ).*/\1/'
它將起作用,因為您的字串中的 IP 地址不在字串的開頭。
查看在線演示:
#!/bin/bash
echo "instream(10.20.213.11@40266):" | \
sed -E 's/.*[^0-9]([0-9] \.[0-9] \.[0-9] \.[0-9] ).*/\1/'
# => 10.20.213.11
如果您的 IP 地址可以以字串開頭,則可以使用
sed -E 's/(.*[^0-9]|^)([0-9] (\.[0-9] ){3}).*/\2/'
請參閱此在線演示。在這里,(.*[^0-9]|^)匹配直到最右邊的非數字或字串開頭的任何文本。現在,IP 地址匹配模式將落在第 2 組中,因此\2在替換 (RHS) 中使用。
如果您sed支持單詞邊界,請考慮使用單詞邊界:
sed -E 's/.*\b([0-9] (\.[0-9] ){3})\b.*/\1/'
也請參閱此在線演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/531353.html
標籤:壳sed
上一篇:bashshell的清潔環境
下一篇:使用bash腳本順序輸出多ssh
