我如何获得第一个双引号中的值?
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
- 仅打印成功替换的结果。
【讨论】:
以上是关于我如何获得第一个双引号中的值?的主要内容,如果未能解决你的问题,请参考以下文章