我的Linux存储库文件包含一个链接,该链接到目前为止使用带有端口号的http指向它的存储库。
baseurl = http://host.domain.com:123/folder1/folder2
我现在需要一种方法来替换该URL以使用没有端口或不同端口的https。 我还需要更改服务器名称,例如从host.domain.com更改为host2.domain.com
所以我的想法是使用sed来搜索http的开头直到第一个/来自2之后//因此捕捉到它们之间的任何内容并且将使我能够更改服务器名称端口或http \ s的使用。
我现在正在使用此代码(我只使用echo作为示例):
该示例显示了在一种情况下,我有一个链接,http和端口123转换为https,第二次反过来 由于一般原因,我的两个代码都使用相同的sed。
WANTED_URL="https://host.domain.com"
echo 'http://host.domain.com:123/folder1/folder2' | sed -i "s|http.*://[^/]*|$WANTED_URL|"
OR
WANTED_URL="http://host.domain.com:123"
echo 'https://host.domain.com/folder1/folder2' | sed -i "s|http.*://[^/]*|$WANTED_URL|"
是这样做的正确方法吗?
答案 0 :(得分:2)
sed
正则表达式是贪婪的。您可以告诉sed
仅使用非斜杠,如下所示:
echo 'http://host.domain.com:123/folder1/folder2' | sed -e 's|http://[^/]*|https://host.domain.com|'
结果:
https://host.domain.com/folder1/folder2
(顺便说一下,你不必因为你使用的是另一个分隔字符而逃避斜线)
密钥正在使用[^/]*
,它将匹配任何但斜杠,因此它会在第一个斜杠处停止匹配(非贪婪)。
您使用/.*/
而.*
可以包含斜杠,而不是您想要的(默认为贪婪)。
无论如何,我的方法是不同的,因为表达式不包括尾部斜杠,所以它不会从最终输出中删除。
答案 1 :(得分:1)
假设您有1个sed脚本或2个并不是真的重要,并且没有充分理由对URL进行硬编码:
$ echo 'http://host.domain.com:123/folder1/folder2' |
sed 's|\(:[^:]*\)[^/]*|s\1|'
https://host.domain.com/folder1/folder2
$ port='123'; echo 'https://host.domain.com/folder1/folder2' |
sed 's|s\(://[^/]*\)|\1:'"$port"'|'
http://host.domain.com:123/folder1/folder2
如果那不是你需要的,那么编辑你的问题以澄清你的要求,特别解释原因:
并提供简明,可测试的样本输入和预期输出,以证明这些需求(即上述情况不起作用的情况)。
你有什么:
WANTED_URL="https://host.domain.com"
echo 'http://host.domain.com:123/folder1/folder2' | sed -i "s|http.*://[^/]*|$WANTED_URL|"
主要问题是:
$y
使用cmd 'x'"$y"'z'
而不是cmd "x${y}z"
,因为后者将在加密和危险的情况下失败并给出各种输入,脚本文本,环境设置和/或运行它的目录的内容。-i
选项是就地编辑文件,因此您无法在传入管道上使用它,因为您无法就地编辑管道。