【问题标题】:How to extract a string between two characters?如何提取两个字符之间的字符串?
【发布时间】:2019-10-26 00:47:39
【问题描述】:

我有一个字符串“foo [string] bar”,想从中提取“string”,取消之前和之后的所有内容。

我的 grep 没有 -P 选项,所以我尝试使用 sed。

echo "foo [string] bar" | sed -n -e '/\[/,/\]/p'

我得到的是命令行中的完整字符串。

【问题讨论】:

  • 也许 sed -n -e '/.*\[\(.*\)].*/\1/p' 但它适用于每行一对括号

标签: awk sed


【解决方案1】:

第一种解决方案:如果您对awk 没问题,那么请您尝试关注。

echo "foo [string] bar"  | awk -F"[][]" '{print $2}'

第二个解决方案:sed试试:

echo "foo [string] bar"  | sed 's/\([^[]*\)\[\([^]]*\)\(.*\)/\2/' 

第三种解决方案:

echo "foo [string] bar"  | awk '{sub(/[^[]*/,"");sub(/\[/,"");sub(/\].*/,"")} 1'

第四个解决方案:考虑到您的变量将只有一组[],如果是这种情况,那么遵循最简单的一个将对您有所帮助。

echo "foo [string] bar"  | sed 's/.*\[//;s/\].*//'

第五个解决方案:在这里使用awkmatch函数。

echo "foo [string] bar" | awk 'match($0,/\[[^]]*/){print substr($0,RSTART+1,RLENGTH-1)}'

【讨论】:

    【解决方案2】:

    使用grep

    echo "foo [string] bar" | grep -oP '\[\K[^]]+' 
    string
    

    如果您的 grep 支持 PCRE-P 标志),您可以使用正则表达式捕获 [] 之间的内容。
    下面是命令的分解:

    -o:此标志将告诉 grep 仅打印匹配的正则表达式,而不是整个匹配行。
    -P:这将启用 PCRE
    \[\K[^]]+\K 将允许匹配它的左侧,但不要将其视为输出的一部分。 [^]]+ 表示,如果除了] 之外还有其他匹配项,请继续前进

    【讨论】:

      【解决方案3】:
      echo "foo [string] bar" | awk '{gsub(/\[|\]/,"");print $2}'
      string
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-17
        • 1970-01-01
        • 2019-10-10
        • 2020-10-15
        • 2019-10-25
        • 2014-02-26
        相关资源
        最近更新 更多