2017-08-24 143 views
0

我檢查了一些文章,發現sed與正則表達式。我將提示映射到了我的問題上,但沒有成功。用sed提取字符串

這不是爲我工作:

echo "uri=https://myserver.domain.de:1234" | sed 's|//\(.+\):|\1|' 

我預計

myserver.domain.de 

但得到了整個字符串

uri=https://myserver.domain.de:1234 

回答

1

你需要在比賽之前和之後的部分匹配它,並用*(或者跳過+,這將使其在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反向引用將只保留捕獲值。

0

我現在發現這個解決方案:

echo "uri=https://myserver.domain.de:1234" | sed -r 's|(.+//)([^:]+)(:.+)|\2|' 

答案

myserver.domin.de 
+0

你不必捕捉組1和3在其中。這將是一個過度衝擊 – nu11p01n73R

+0

@tbasien:這基本上是我用POSIX ERE語法編寫的模式(用'+'代替'*',我還注意到了量詞)。如果我的解決方案有效,請考慮接受我的答案。 –

0

沒有必要在這裏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]\+$,,'