【问题标题】:find a substring inside a bash variable [duplicate]在bash变量中找到一个子字符串[重复]
【发布时间】:2011-05-14 00:31:14
【问题描述】:

我们试图找到一个 mercurial url 的用户名:

default = ssh://someone@acme.com//srv/hg/repo

假设总是有一个用户名,我想出了:

tmp=${a#*//}
user=${tmp%%@*}

有没有办法在一行中做到这一点?

【问题讨论】:

  • 在两个操作之间使用分号(而不是换行符)算数吗?

标签: bash


【解决方案1】:

假设您的字符串在这样的变量中:

url='default = ssh://someone@acme.com//srv/hg/repo'

你可以这样做:

[[ $url =~ //([^@]*)@ ]]

那么你的用户名就在这里:

echo ${BASH_REMATCH[1]}

这适用于 Bash 3.2 及更高版本。

【讨论】:

    【解决方案2】:

    您几乎需要更多的语句或调用外部工具。我认为 sed 最适合这个。

    sed -r -e 's|.*://(.*)@.*|\1|' <<< "$default"
    

    【讨论】:

    • 我不记得以前见过那个结构——&lt;&lt;&lt;——所以我刚刚学到了一些新东西。通常我把echo的变量改成sed;我想这个结构更有效?
    • 我想是的,因为 echo 和 pipe 意味着整个“另一个子shell”,而 here 字符串正在处理中。
    【解决方案3】:

    不在 bash 本身内。您必须委派给 sed 等外部​​工具。

    【讨论】:

      【解决方案4】:

      不熟悉mercurial,但是使用你的url,你可以做

      echo 'ssh://someone@acme.com/srv/hg/repo' |grep -E --only-matching '\w+@' |cut --delimiter=\@ -f 1
      

      这两个管道可能不是最有效的方法,但有效。

      【讨论】:

        猜你喜欢
        • 2017-07-29
        • 1970-01-01
        • 2018-09-23
        • 2014-07-03
        • 2019-11-12
        • 2018-11-21
        • 1970-01-01
        • 2011-01-23
        • 1970-01-01
        相关资源
        最近更新 更多