【问题标题】:Extract multiple captured groups from sed to variables将多个捕获的组从 sed 提取到变量
【发布时间】:2012-10-25 13:14:54
【问题描述】:

我有以下文字

abc <THIS> abc <THAT> abc <WHAT> abc

其中abc 是定义明确的表达式的占位符。我想提取括号中的 3 个术语并将它们保存在 3 个单独的变量中。是否可以在不解析文本 3 次的情况下做到这一点?基本上我想捕获并以某种方式“导出”多个组。

很明显,我可以像这样提取其中一个:

VARIABLE=`echo $TEXT | sed "s_abc <\(.*\)> abc <.*> abc <.*> abc_\1_g"`

但是是否有可能在不运行sed 3 次的情况下获得所有 3 个?

也欢迎其他不带sed 的(便携式)解决方案。

【问题讨论】:

    标签: macos bash shell unix sed


    【解决方案1】:

    如果有任何你知道不会出现在THISTHATWHAT中的字符,那么你可以这样写:

    IFS=$'\t' read -r VAR1 VAR2 VAR3 \
        < <(sed 's/^abc <\(.*\)> abc <\(.*\)> abc <\(.*\)> abc$/\1\t\2\t\3/' \
                 <<< "$TEXT"
           )
    

    告诉sed 在其输出中使用该分隔符,并告诉read 在其输入中使用该分隔符。

    【讨论】:

      【解决方案2】:

      这可能对你有用(GNU sed 和 bash):

      line='abc <THIS> abc <THAT> abc <WHAT> abc'
      var=($(sed 's/[^<]*<\([^>]*\)>[^<]*/"\1" /g' <<<"$line"))
      echo "first ${var[0]} second ${var[1]} third ${var[2]}"
      first "THIS" second "THAT" third "WHAT"
      

      【讨论】:

      • $(foo) 运算符的名称是什么?是不是类似于`foo`
      【解决方案3】:

      无需生成进程:

      var='abc <THIS> abc <THAT> abc <WHAT> abc'
      var1=${var#abc <}          # Remove the leading 'abc <'.
      THIS="${var1%%> abc <*}"   # Remove the longest trailing '> abc <*'.
      var2="${var1#*> abc <}"    # Remove the shortest leading '*> abc <'.
      THAT="${var2%%> abc <*}"   # Remove the longest trailing '> abc <*'.
      var3="${var2#*> abc <}"    # Remove the shortest leading '*> abc <'.
      WHAT="${var3%> abc}"       # Remove the trailing '> abc'
      echo "$THIS"
      echo "$THAT"
      echo "$WHAT"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-26
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        相关资源
        最近更新 更多