我檢查了一些文章,發現sed
與正則表達式。我將提示映射到了我的問題上,但沒有成功。用sed提取字符串
這不是爲我工作:
echo "uri=https://myserver.domain.de:1234" | sed 's|//\(.+\):|\1|'
我預計
myserver.domain.de
但得到了整個字符串
uri=https://myserver.domain.de:1234
我檢查了一些文章,發現sed
與正則表達式。我將提示映射到了我的問題上,但沒有成功。用sed提取字符串
這不是爲我工作:
echo "uri=https://myserver.domain.de:1234" | sed 's|//\(.+\):|\1|'
我預計
myserver.domain.de
但得到了整個字符串
uri=https://myserver.domain.de:1234
你需要在比賽之前和之後的部分匹配它,並用*
(或者跳過+
,這將使其在GNU sed
工作與BRE POSIX模式):
echo "uri=https://myserver.domain.de:1234" | sed 's|.*//\(.*\):.*|\1|'
結果:myserver.domain.de
。
查看online demo。
下面是一個alternative pattern:
sed 's|.*//\([^:]*\).*|\1|'
其中.*
內部的捕獲組替換爲[^:]*
(任何0+比:
其他字符,見下文)。
詳細
.*
- 任何0+字符,儘可能多,達到後續子模式//
- 一個//
子\(.*\)
- 第1組:任何0+字符儘可能多(或者,爲了限制引擎一點,您可以在這裏使用[^:]*
而不是.*
(以匹配除:
以外的任何0+字符):
- 冒號.*
- 行其餘的\1
反向引用將只保留捕獲值。
我現在發現這個解決方案:
echo "uri=https://myserver.domain.de:1234" | sed -r 's|(.+//)([^:]+)(:.+)|\2|'
答案
myserver.domin.de
沒有必要在這裏sed的。這裏有一個辦法做到這一點使用名爲parameter expansion便攜式POSIX功能:
full="uri=https://myserver.domain.de:1234"
withoutport="${full%:[[:digit:]]*}" # Strip the trailing port number (":1234")
desired="${withoutport#uri=https://}" # Strip the undesired prefix
printf '%s\n' "$desired"
您可以Open Group Standard Vol. 3: Shell and Utilities, Issue 7: 2.6.2 Parameter Expansion在公開組服務器出版物閱讀更多關於它在這裏。
如果你堅持使用SED,但是,那麼這裏就是相當可讀的解決方案:
sed -e 's,^uri=https://,,' -e 's,:[0-9]\+$,,'
你不必捕捉組1和3在其中。這將是一個過度衝擊 – nu11p01n73R
@tbasien:這基本上是我用POSIX ERE語法編寫的模式(用'+'代替'*',我還注意到了量詞)。如果我的解決方案有效,請考慮接受我的答案。 –