用sed提取字符串

时间:2017-08-24 11:51:29

标签: regex shell sed

我查了几篇文章,发现sed有正则表达式。我将提示映射到我的问题,但没有成功。

这对我不起作用:

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

我期待

myserver.domain.de

但得到了整个字符串

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

3 个答案:

答案 0 :(得分:1)

您需要在匹配前和匹配后匹配该部分,并将+替换为*(或转义+,这将使其在GNU {{1}中有效使用BRE POSIX模式):

sed

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

查看online demo

这是alternative pattern

myserver.domain.de

其中捕获组内的sed 's|.*//\([^:]*\).*|\1|' 替换为.*[^:]*以外的任何0 +字符,请参见下文)。

<强>详情

  • : - 尽可能多的0个字符,直到后续子图案的最后一次出现
  • .* - //子字符串
  • // - 第1组:尽可能多的0个字符(或者,为了稍微限制引擎,您可以在此使用\(.*\)代替[^:]*(以匹配任何字符)除.*
  • 以外的0+个字符
  • : - 冒号
  • : - 其余部分

.*反向引用将仅保留捕获的值。

答案 1 :(得分:0)

我现在找到了这个解决方案:

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

答案

myserver.domin.de

答案 2 :(得分:0)

这里没有必要。这是使用名为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"

您可以在The Open Group Publications Server的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]\+$,,'