【问题标题】:Cut a substring in bash在bash中剪切一个子字符串
【发布时间】:2017-11-29 06:12:46
【问题描述】:

假设我有以下字符串:

some letters foo/substring/goo/some additional letters

我需要提取这个子字符串,假设foo//goo 是预先知道的常量字符串。我该怎么做?

【问题讨论】:

    标签: bash substring


    【解决方案1】:

    这个 sed one-liner 可以做到。

    sed 's#.*foo/##;s#/goo/.*##' file
    

    除了 sed、awk 之外,grep 也能胜任。或者使用 zsh:

    kent$  v="some letters foo/substring/goo/some additional letters"  
    
    kent$  echo ${${v##*foo/}%%/goo/*}                                
    substring
    

    请注意:

    @Nahuel Fouilleul 的评论

    ${var%%/goo/*}中的var必须是变量名,不能是扩展的结果

    如果使用 bash,则该行应分为两个语句。

    $ echo $0
    bash
    $ v="some letters foo/substring/goo/some additional letters"
    $ v=${v##*foo/}
    $ v=${v%%/goo/*}
    $ echo $v
    substring
    

    我在 zsh 中执行的行,工作,但我只是在 bash 中测试,它没有工作。

    $  echo $0
    -zsh
    $  v="some letters foo/substring/goo/some additional letters" 
    $  echo ${${v##*foo/}%%/goo/*}                                
    substring
    

    【讨论】:

    • in ${var%%/goo/*} var 必须是变量名,不能是扩展的结果
    • @NahuelFouilleul thx,我将您的评论放在答案中。我刚刚在zsh中进行了测试,并且成功了。我的错。
    • 请您给出这两个陈述
    • 第一个解决方案可能应该是“or with zsh”,不是吗?
    • @Kent 如果我有两行 sed 解决方案如何变化怎么办?即 line1 /n 一些字母 foo/substring/goo/一些额外的字母
    【解决方案2】:

    带变量扩展

    line='some letters foo/substring/goo/some additional letters'
    line=${line%%/goo*}             # remove suffix  /goo*
    line=${line##*foo/}             # remove prefix  *ffo/
    echo "$line"
    

    或 bash 正则表达式

    line='some letters foo/substring/goo/some additional letters'
    if [[ $line =~ foo/([^/]*)/goo ]]; then
        echo "${BASH_REMATCH[1]}"
    fi
    

    【讨论】:

      【解决方案3】:

      如果您知道“其他字母”中没有其他/,则可以使用cut

       > echo "some letters foo/substring/goo/some additional letters" | cut -d'/' -f2
      

      【讨论】:

      • 其实有
      • $ echo "some letters foo/substring/goo/some additional letters" | awk -F/ '{ print $2}' )) 但你的选择更好。
      • 即使“其他字母”没有/,如果“子字符串”包含/也会失败
      • 全部正确 - 我只是分享一个仅在某些特定情况下有效的简单解决方案 - 也就是说,当没有其他方法使用 / 时。
      【解决方案4】:

      就可读性而言,我认为 awk 是一个很好的解决方案

      echo "some letters foo/substring/goo/some additional letters" | awk -v FS="(foo/|/goo)" '{print $2}'
      

      【讨论】:

        猜你喜欢
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        • 2015-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        相关资源
        最近更新 更多