如何获取第一个双引号中存在的值?

Sou*_*brt 5 bash shell awk sed

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

name


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



place
Run Code Online (Sandbox Code Playgroud)

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

water bottle
Run Code Online (Sandbox Code Playgroud)

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

awk '/:/ {print $2}'
Run Code Online (Sandbox Code Playgroud)

但这只是给出

water
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

awk '/:/' test.txt | cut -d\" -f2
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 1

解决方案一:awk

您可以使用单个awk命令:

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

请参阅在线演示

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

解决方案2:awk+cut

您可以使用awk+ cut

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

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

解决方案3:sed

或者,您可以使用sed

awk '/:/' test.txt | cut -d\" -f2 > outfile
Run Code Online (Sandbox Code Playgroud)

请参阅在线演示

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

该命令的意思是

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