我如何获得第一个双引号中的值?

Posted

技术标签:

【中文标题】我如何获得第一个双引号中的值?【英文标题】: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

【问题讨论】:

使用"作为字段分隔符 感谢它的工作。不过我得到了额外的空间。 你是指文件中的第一个还是文件的每条记录中的第一个? 【参考方案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 - 仅打印成功替换的结果。

【讨论】:

以上是关于我如何获得第一个双引号中的值?的主要内容,如果未能解决你的问题,请参考以下文章

如果存在,则删除双引号之间的第一个逗号

获取从VBA中的段落获得的行的第一个单词的索引号

仅替换第 N 列中的所有双引号

在awk中搜索带双引号的字符串

为什么这个regex可以拆分第二个双引号而不是第一个双引号?

如何将字符串去掉引号