【发布时间】:2021-02-10 11:09:36
【问题描述】:
我必须解析一个非常长的字符串(来自标准输入)。它基本上是一个 .sql 文件。我必须从中获取数据。我正在努力解析数据,以便可以将其转换为 csv。为此,我正在使用 awk。就我而言,样本 sn-p(两条记录)如下:
b="(abc@xyz.com,www.example.com,'field2,(2)'),(dfr@xyz.com,www.example.com,'field0'),"
echo $b|awk 'BEGIN {FPAT = "([^\\)]+)|('\''[^'\'']+'\'')"}{print $1}'
在我的正则表达式中,我说的是“)”括号上的拆分,或者如果找到单引号,则忽略所有文本,直到找到最后一个引号。但我的输出如下:
(abc@xyz.com,www.example.com,'field2,(2
我期待这个输出
(abc@xyz.com,www.example.com,'field2,(2)'
我的代码中的问题在哪里。我搜索了很多并检查了 awk 手册,但没有成功。
【问题讨论】:
-
试试
awk 'BEGIN {FPAT = "(,|'\''[^'\'']+'\''|\\([^()]*\\)|[^[:space:]()'\''])+"}{print $1}' -
所有
'\''s 都令人困惑。我建议您首先使用'以外的字符(例如#)开发您的正则表达式,然后将每个#更改为\047(或'\'',如果您真的想使用它)。因此,在您处理它时将您的输入更改为b="(abc@xyz.com,www.example.com,#field2,(2)#),(dfr@xyz.com,www.example.com,#field0#),",将您的FPAT 更改为"([^\\)]+)|(#[^#]+#)",然后在您使用“正常”字符找出正则表达式后将其全部更改。你真的是指[^\\)]- 除了反斜杠或)以外的任何字符?
标签: sql regex bash awk string-parsing