如何用SED编辑URL字符串



我的linux存储库文件包含一个链接,到目前为止,该链接正在使用带有端口号码的HTTP来指向其存储库。

baseurl = http://host.domain.com:123/folder1/folder2

我现在需要一种替换该URL的方法来使用没有端口或其他端口的HTTP。我还需要将服务器名称从host.domain.com更改为host2.domain.com

所以我的想法是使用SED来搜索HTTP的开始,直到第一个//之后的第一个/到达第一个///,从而捕获了两者之间的所有内容,并将使我能够更改服务器名称端口或HTTP s用法。

im现在使用此代码(im仅用于示例):

该示例显示了我一次与HTTP链接和端口123转换为HTTPS的链接以及第二次链接的示例如何而且我出于一般原因使用了同样的SED代码。

WANTED_URL="https://host.domain.com"
echo 'http://host.domain.com:123/folder1/folder2' | sed -i "s|http.*://[^/]*|$WANTED_URL|"

WANTED_URL="http://host.domain.com:123"
echo 'https://host.domain.com/folder1/folder2' | sed -i    "s|http.*://[^/]*|$WANTED_URL|"

这是正确的方法吗?

sed regexes默认情况下是贪婪的。您可以告诉sed仅消耗非斜线,例如:

 echo  'http://host.domain.com:123/folder1/folder2' | sed -e 's|http://[^/]*|https://host.domain.com|'

结果:

https://host.domain.com/folder1/folder2

(顺便说一句,您不必逃脱斜线,因为您正在使用替代分离字符)

密钥是使用[^/]*,它将匹配任何,但 slashes,因此它停止在第一个斜线(非怪兽)处匹配。

您使用的/.*/.*可以包含斜线,而不是您想要的(默认情况下)。

无论如何我的方法是不同的,因为表达式不包括后斜线,因此不会从最终输出中删除。

假设您有1个sed脚本或2个脚本并不重要,并且没有充分的理由硬编码URL:

$ echo 'http://host.domain.com:123/folder1/folder2' |
    sed 's|(:[^:]*)[^/]*|s1|'
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

如果不是您需要的,请编辑您的问题以澄清您的要求,特别是解释原因:

  1. 您想使用硬编码的URL,
  2. 您需要1个脚本才能进行这两个转换。

并提供了证明这些需求的简洁,可测试的样本输入和预期输出(即以上情况不起作用的情况)。

wrt你拥有的:

WANTED_URL="https://host.domain.com"
echo 'http://host.domain.com:123/folder1/folder2' | sed -i "s|http.*://[^/]*|$WANTED_URL|"

主要问题是:

  1. 请勿将全部用户用于非出口外壳变量名称,以避免与导出变量发生冲突并避免混淆您的代码(此惯例已经存在了40年,因此人们期望所有上层案例变量都会导出)。
  2. 切勿将任何脚本封闭在双引号中,因为它将整个脚本公开到壳上以进行解释,以便在您要执行的命令之前。取而代之的是,只需在必要时打开最小脚本段的单个引号,即在脚本中展开$y使用cmd 'x'"$y"'z'而不是cmd "x${y}z",因为后者将在各种输入,脚本文本,环境设置和/或内容的内容上易于且危险地失败。您从。
  3. 运行的目录
  4. SED的-i选项是在原地编辑文件,以便您不能在传入管道上使用它,因为您不能原位编辑管道。
  5. 当您让shell变量扩展成为脚本的一部分时,您必须关心它包含的可能字符,以及如何通过命令解释它们,给定变量扩展为上下文。如果让整个URL扩展到SED脚本的替换部分,则必须小心首先摆脱任何潜在的反向注册字符或脚本定界符。看到有可能可靠地通过SED逃脱正则分子。如果您只是让端口号扩展,那么您就不必处理任何一个。

最新更新