Bash正则表达式为“not space,逗号,而不是空格”

时间:2018-04-18 04:38:25

标签: regex bash

我有一个这样的文件:

  

a,b,c,“你好,嗨”,d

我希望字段分隔符不是空格,逗号,而不是空格。 目前我有

  

cat file | awk'BEGIN {FS =“[^],[^]”}; {print $ 4}'

哪个应该给“你好,嗨”,但它什么都不返回。我对这个正则表达式的东西很陌生,所以任何帮助都会受到赞赏。

4 个答案:

答案 0 :(得分:2)

呃,不,不应该给hello, hi。实际发生的是:

 a,b,c,"hello, hi",d
|| ||| ||       ||_|Third fied separator
|| ||| ||_______|
|| ||| |   $3
|| |||_|
|| || Second field separator
|| ||
|| |+- $2 is a comma
||_|
| First field separator
|
+- $0 is empty

因此在第三个字段分隔符后,该行为空。您可以使用

验证此行为
aaa,baa,caa,"hello, hi",daa

作为输入文件。

答案 1 :(得分:1)

如果您经常使用CSV文件,请考虑安装csvtool,然后您可以简单地说:

integer

它会吐出来

%

答案 2 :(得分:1)

解决方案是定义字段内容而不是字段分隔符。您需要使用gawk,因为标准awk本身没有此功能。 (在linux上,awk = gawk)

echo 'a,b,c,"hello, hi",d' \
 | awk '
     # define the content with FPAT
     # here any non , or a encapsulate quoted content
     BEGIN{ FPAT = "[^,]*|\"[^\"]*\"" }

     # for showing each field
     {for (i=1;i<=NF;i++) printf( "field %d: %s\n", i, $i)}
     '

field 1: a
field 2: b
field 3: c
field 4: "hello, hi"
field 5: d

默认情况下,正则表达式匹配尝试始终采用尽可能长的时间,因此“..,...”比“..和/或...”更长,采用完整的引号字符串而不是部分逗号分隔的内容相同的字符串

答案 3 :(得分:1)

您还可以使用sed

>sed 's/.*\("[^"]*"\).*/\1/' <<< 'a,b,c,"hello, hi",d'
"hello, hi"

grep

>grep -o '"[^"]*"' <<< 'a,b,c,"hello, hi",d'
"hello, hi"