在shell中解析没有公共分隔符的文件

时间:2015-12-14 10:25:35

标签: regex perl shell awk

我想请求您帮助解析shell中的文件。

这是我的数据:

ID:1 g-t="Demo one" rfid="af7e 25" t-link="http://demo.site.com/api2",User af73 25 http://example.com/useraf73
ID:2 g-t="Demo one" rfid="77 63" t-link="http://demo.site.com/api",User 77 http://example.com/user77

没有通用的分隔符,基本上我需要这些字段:

ID=1 | g-t="Demo one" | rfid="af7e 25" | t-link="http://demo.site.com/api2" | User af73 25 | http://example.com/useraf73

这是我被困的地方:

awk '{match($0,"g-t=([^\" ]+)",a)}END{print a[1]}'

我试图将双引号与空格匹配,但我不知道为什么它不打印结果。除双引号外,所有字符都可以正常工作。 我做错了什么? Awk不是必须的,我愿意接受建议。

感谢。

1 个答案:

答案 0 :(得分:1)

我已经有一段时间了,因为我经常使用awk但是如果我记得正确匹配()只需要2个args而END {}只发生一次,而不是像我想要的那样每一行。类似的东西:

 awk '{match($0,/g-t="([^\"]+")/); print substr($0, RSTART, RLENGTH)}' dataFile

可能更贴近您的想法?

蛮力Perl one-liner看起来像这样:

perl -lne 'if (m/ID:(\S+) g-t="([^"]+)" rfid="([^"]+)" t-link="([^"]+)",User (.*) (http:.*)/){print "$1|$2|$3|$4|$5|$6"}' dataFile

并演示如何通过OR条分隔所有字段数据。您可以移动()组以获得或多或少的每个结果$ 1,$ 2等所需的文本...有关详细信息,请参阅 perldoc perl