我查了几篇文章,发现sed
有正则表达式。我将提示映射到我的问题,但没有成功。
这对我不起作用:
echo "uri=https://myserver.domain.de:1234" | sed 's|//\(.+\):|\1|'
我期待
myserver.domain.de
但得到了整个字符串
uri=https://myserver.domain.de:1234
答案 0 :(得分:1)
您需要在匹配前和匹配后匹配该部分,并将+
替换为*
(或转义+
,这将使其在GNU {{1}中有效使用BRE POSIX模式):
sed
结果:echo "uri=https://myserver.domain.de:1234" | sed 's|.*//\(.*\):.*|\1|'
。
查看online demo。
myserver.domain.de
其中捕获组内的sed 's|.*//\([^:]*\).*|\1|'
替换为.*
([^:]*
以外的任何0 +字符,请参见下文)。
<强>详情
:
- 尽可能多的0个字符,直到后续子图案的最后一次出现.*
- //
子字符串//
- 第1组:尽可能多的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]\+$,,'