【问题标题】:Remove word from url从网址中删除单词
【发布时间】:2021-07-13 12:03:31
【问题描述】:

我需要从此来源中删除 /%(tenant_id)s

https://ext.an1.test.dev:8776/v3/%(tenant_id)s

让它看起来像这样:

https://ext.an1.test.dev:8776/v3

我正在尝试通过 sed,但没有成功。

curl ....... | jq -r .endpoints[].url | grep '8776/v3' | sed -e 's/[/%(tenant_id)s] //g'

我又明白了:

https://ext.an1.test.dev:8776/v3/%(tenant_id)s

【问题讨论】:

    标签: bash api sed openstack


    【解决方案1】:

    您似乎对方括号的含义感到困惑。

    curl ....... |
    jq -r '.endpoints[].url' |
    sed -n '\;8776/v3;s;/%.*;;p'
    

    修复了不正确的正则表达式,丢失了useless grep,并通过切换到不同的分隔符在某种程度上简化了处理。为了防止jq 搜索表达式中的文本(不太可能)shell 通配符匹配,我还在其周围添加了单引号。

    更详细地说,sed -n 避免打印输入行,地址表达式\;8776/v3; 仅选择匹配正则表达式8776/v3 的输入行;我们使用; 作为正则表达式周围的分隔符,这(有点晦涩)要求起始分隔符被反斜杠。然后,我们执行替换:再次,我们使用; 作为分隔符,这样正则表达式中的斜杠和百分号就不需要转义。替换上的p 标志导致sed 打印成功执行替换的行;我们删除了g 标志,因为我们不希望每个输入行有多个匹配项。替换将第一次出现 /% 之后的所有内容替换为空。

    (等效地,使用斜线分隔符,您必须对所有文字斜线进行反斜线:sed -n '/8776\/v3/s/\/%.*//p'。)

    作为记录,正则表达式中的方括号构成一个字符类;表达式[abc] 匹配可以是abc 之一的单个字符.或许可以查看Stack Overflow regex tag info page 上的提示,以便快速了解此错误和其他常见的初学者错误。

    除了不正确的方括号外,您的正则表达式在s 之后指定了一个空格,这不太可能存在。除此之外,如果您确定要删除的字符串始终完全是/%(tenant_id)s,则您的正则表达式应该可以正常工作。 (许多正则表达式方言需要转义圆括号,但没有-E-rsed 不是其中之一。)

    【讨论】:

      【解决方案2】:

      如果您设法将地址放入变量中,那么一种参数扩展想法:

      $ myaddr='https://ext.an1.test.dev:8776/v3/%(tenant_id)s'
      
      $ echo "${myaddr%/*}"
      https://ext.an1.test.dev:8776/v3
      
      $ mynewaddr="${myaddr%/*}"
      $ echo "${mynewaddr}"
      https://ext.an1.test.dev:8776/v3
      

      【讨论】:

      • 如果您稍后要在脚本中使用此 URL,这比我回答中的 sed 方法更好。
      猜你喜欢
      • 1970-01-01
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      相关资源
      最近更新 更多