【问题标题】:How do i get the value present in first double quotes?我如何获得第一个双引号中的值?
【发布时间】:2022-01-15 02:29:33
【问题描述】:

我目前正在编写一个 bash 脚本来获取许多逗号分隔字符串中的第一个值。 我有一个看起来像这样的文件 -

name


things: "water bottle","40","new phone cover",10



place

我只需要在第一个双引号中返回值。

water bottle

第一个双引号中的值可以是一个单词/两个单词。也就是说,water bottle 有时可以替换为pen。 我试过了-

awk '/:/ {print $2}'

但这只是给了

water

我想用逗号分隔它,但things 后面有colon(:)。所以,我不确定如何分开它。 如何获取第一个双引号中的值?

编辑:

解决方案: 我使用了下面的代码,因为我特别想使用 awk -

awk '/:/' test.txt | cut -d\" -f2

【问题讨论】:

  • 使用"作为字段分隔符
  • 感谢它的工作。不过我得到了额外的空间。
  • 你是指文件中的第一个还是文件的每条记录中的第一个?

标签: bash shell awk sed


【解决方案1】:

使用cut 实用程序的解决方案可能是

cut -d\" -f2 infile > outfile

【讨论】:

    【解决方案2】:

    使用gnu awk,您可以使用捕获组,并使用negated character class 不跨越,,因为这是字段分隔符。

    awk 'match($0, /^[^",:]*:[^",]*"([^"]*)"/, a) {print a[1]}' file
    

    输出

    water bottle
    

    模式匹配

    • ^ 字符串开始
    • [^",:]*:可选匹配除",:之外的任何值,然后匹配:
    • [^",]* 可以选择匹配除", 之外的任何值
    • "([^"]*)" 在第 1 组中捕获双引号之间的值

    如果该值始终在双引号之间,获得所需结果的一个简短选项可能是将字段分隔符设置为 " 并检查第 1 组是否包含冒号,但从技术上讲,如果有,您也可以得到 water bottle只是一个前导双引号,而不是关闭一个。

    awk -F'"' '$1 ~ /:/ {print $2}' file
    

    【讨论】:

      【解决方案3】:

      使用您展示的示例,请尝试关注awk 代码。

      awk '/^things:/ && match($0,/"[^"]*/){print substr($0,RSTART+1,RLENGTH-1)}' Input_file
      

      解释:awk 程序中检查行是否以事物开头:并使用match 函数匹配第一个和第二个" 之间的所有内容并打印它们相应地。

      【讨论】:

        【解决方案4】:

        解决方案 1:awk

        您可以使用单个awk 命令:

        awk -F\" 'index($1, ":"){print $2}' test.txt > outfile
        

        请参阅online demo

        -F\" 将字段分隔符设置为 " 字符,index($1, ":") 条件确保字段 1 包含 : 字符(不需要正则表达式),然后 {print $2} 打印第二个字段值。

        解决方案 2:awk + cut

        你可以使用awk + cut:

        awk '/:/' test.txt | cut -d\" -f2 > outfile
        

        使用awk '/:/' test.txt,您将提取包含: 字符的行,然后管道cut -d\" -f2 命令将以" 作为分隔符拆分字符串并返回第二项。请参阅online demo

        解决方案 3:sed

        或者,您可以使用sed

        sed -n 's/^[^"]*"\([^"]*\)".*/\1/p' file > outfile
        

        online demo

        #!/bin/bash
        s='name
        things: "water bottle","40","new phone cover",10
        place'
         
        sed -n 's/^[^"]*"\([^"]*\)".*/\1/p' <<< "$s"
        # => water bottle
        

        命令的意思

        • -n - 该选项禁止默认行输出
        • ^[^"]*"\([^"]*\)".* - 匹配的 POSIX BRE 正则表达式模式
          • ^ - 字符串开头
          • [^"]* - 除了" 之外的零个或多个字符
          • " - 一个 " 字符
          • \([^"]*\) - 第 1 组(\1 指此值):除 " 之外的任何零个或多个字符
          • ".* - " 字符和字符串的其余部分。
        • \1 将匹配替换为第 1 组值
        • p - 仅打印成功替换的结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-13
          • 2011-03-06
          • 1970-01-01
          • 1970-01-01
          • 2018-05-18
          • 2021-02-04
          • 1970-01-01
          • 2019-12-11
          相关资源
          最近更新 更多