【问题标题】:How to extract substring in the double quotes by using awk or other methods?如何使用awk或其他方法提取双引号中的子字符串?
【发布时间】:2023-02-21 10:08:48
【问题描述】:

我要提取在此示例字符串中:

See [ "you" later 

但是,我的尝试没有按预期工作:

 awk '{ sub(/.*\"/, ""); sub(/\".*/, ""); print }' <<< "See [ \"you\" later"

结果:

 later

使用awk或其他方法,如何提取双引号中的子字符串?

【问题讨论】:

  • 如果您的输入只有 1 个引号 (foo"bar) 或没有引号 (foo bar) 或多对引号 (foo"bar" and "more" stuff) 然后将其添加到您的示例输入并显示预期的输出,以便我们了解如何你想要那些被处理的——到目前为止所有的答案都会从你提供的当前样本输入中产生你想要的输出,但是对于我刚才提到的输入,它们的行为各不相同,

标签: linux awk


【解决方案1】:

第一种解决方案:您可以在这里使用awkgsub功能。只需简单地用 NULL 进行 2 次替换。 " 的第 1 次到第 1 次出现,然后将下一次出现的 " 中的所有内容替换为 NULL 并打印该行。

awk '{gsub(/^[^"]*"|".*/,"")} 1' Input_file


第二种解决方案:使用 GNU grep 解决方案。使用其-oP 选项打印匹配的部分并分别启用 PCRE 正则表达式选项。使用正则表达式从开始匹配到第一次出现 " 并使用 K 选项忘记匹配的部分,然后在下一次出现 " 之前再次匹配所有内容,这将根据要求打印 2 " 之间的文本。

grep -oP '^.*?"K[^"]*' Input_file

【讨论】:

    【解决方案2】:

    您也可以在这里使用cut

    cut -d" -f 2 <<< 'See [ "you" later '
    

    它用双引号拆分字符串并获取第二项。

    输出:

    you
    

    请参阅online demo

    【讨论】:

    • idk 如果 OP 可能有这种情况,但在输入 foo"bar 的情况下会输出 bar
    【解决方案3】:

    使用bash

    IFS='"'
    read -ra arr <<< "See [ "you" later"
    echo ${arr[1]}
    

    给出输出

    you
    

    说明:使用IFS通知bash"处拆分,将拆分后的文本读入数组arr打印第二个元素(即[1],因为[0]表示第一个元素)。

    【讨论】:

      【解决方案4】:

      使用 GNU awk 的几种方法:

      多字符RSRT

      $ echo 'See [ "you" later' |
          awk -v RS='"[^"]*"' 'RT{ print substr(RT,2,length(RT)-2) }'
      you
      

      match() 的第三个参数:

      $ echo 'See [ "you" later' |
          awk 'match($0,/"([^"]*)"/,a){ print a[1] }'
      you
      

      gensub()(假设引号字符串始终存在):

      $ echo 'See [ "you" later' |
          awk '{print gensub(/.*"([^"]*)".*/,"\1",1)}'
      you
      

      FPAT:

      $ echo 'See [ "you" later' |
          awk -v FPAT='[^"]*' 'NF>2{print $2}'
      you
      
      $ echo 'See [ "you" later' |
          awk -v FPAT='"[^"]*"' 'NF{print substr($1,2,length($1)-2)}'
      you
      

      patsplit():

      $ echo 'See [ "you" later' |
          awk 'patsplit($0,f,/"[^"]*"/,s){print substr(f[1],2,length(f[1])-2)}'
      you
      

      split() 的第 4 个参数:

      $ echo 'See [ "you" later' |
          awk 'split($0,f,/"[^"]*"/,s)>1{print substr(s[1],2,length(s[1])-2)}'
      you
      

      【讨论】:

        【解决方案5】:

        这是一个没有任何正则表达式的 awk 解决方案:

        s='See [ "you" later'
        awk -F '"' 'NF>2 {print $2}' <<< "$s"
        
        you
        

        或者使用正则表达式的 sed 解决方案:

        sed -E 's/[^"]*"([^"]*)".*//' <<< "$s"
        you
        

        另一个awkmatch

        awk 'match($0, /"[^"]*"/) {print substr($0, RSTART+1, RLENGTH-2)}' <<< "$s"
        
        you
        

        【讨论】:

          【解决方案6】:

          使用sed

          $ sed -n 's/[^"]*"([[:alpha:]]+)"[^"]*/ /gp' input_file
          you
          

          【讨论】:

            【解决方案7】:
            $ grep -oP '(?<=").*(?=")' <<< "See [ "you" later"
            you
            

            【讨论】:

              【解决方案8】:

              提炼全部引用子字符串,并删除引号:

              echo 'See [ "you" later, "" "a" "b" "c' |
              grep -o '"[^"]*"' | tr -d "
              

              给出:

              you
              
              a
              b
              
              • ""在第二行输出匹配为空字符串(使用grep -o '"[^"]+"'跳过空字符串)

              • "c 没有完全引用,所以不匹配

              对于小字符串,您可能希望使用纯 shell。这提取了第一的$str 中引用的子字符串:

              str='Example "a" and "b".'
              str=${str#*"} # Cut up to first quote
              case $str in
                  *"*) str=${str%%"*};; # Cut from second quote onwards
                  *) str= # $str contains less than two quotes
              esac
              echo "$str"
              

              给予

              a
              

              【讨论】:

                【解决方案9】:

                使用awk 免提驾驶:

                echo 'See [ "you" later' | 
                
                gawk ++NF OFS= FS='^[^"]*"|".*$'  # any one of these 3, 
                                                     # specific for this case
                gawk '$_ = $--NF' FS='"' 
                mawk '$!--NF=$NF' FS='"'  
                
                
                you 
                

                【讨论】:

                  【解决方案10】:
                  perl -nE  'say $& if /(?<=")w+/' <<< "See [ "you" later"
                  

                  【讨论】:

                    猜你喜欢
                    • 2012-07-07
                    • 2021-12-19
                    • 1970-01-01
                    • 2013-11-09
                    • 2011-03-18
                    • 1970-01-01
                    • 2019-07-12
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多