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)
解决方案一: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- 只打印成功替换的结果。