首页 > 解决方案 > 为每一行提取正则表达式模式 - 如果不存在模式,则留空行

问题描述

我正在使用以下输入:

"visit_date":{"$date":"2017-11-28T04:43:00.000Z"},"phone":"549-287-5287","city":"Marshall","gender":"female","email":"mortina.curabia@gmail.com"

我需要能够将每行的电话号码和电子邮件提取到单独的文件中。然而,这两个值并不总是出现在同一个字段中——它们总是以“电话”:或“电子邮件”:开头,但它们可能出现在第一个、第二个、第三个甚至第二十个字段中。

我曾尝试将 SED 和 AWK 中的解决方案组合在一起,以删除所有内容,直到“电话”,然后每隔一个,但这并不能按预期工作。这也意味着,如果“电话”和/或“电子邮件”不存在,则线路根本不会改变。

我需要一个解决方案,它会给我一个文件中每一行的电话值和另一个文件中的电子邮件值的输出。但是,如果不存在电话或电子邮件值,则需要在输出中放置一个空白行。

有任何想法吗?

标签: awksedgrep

解决方案


这可能对您有用(GNU sed):

sed -Ene 'h;/.*"phone":([^,]*).*/!z;s//\1/;w phoneFile' -e 'g;/.*"email":([^,]*).*/!z;s//\1/;w emailFile' file

复制行。

如果该行不包含电话号码,则清空该行,否则删除除电话号码之外的所有内容。

将结果写入电话号码文件。

用原始行的副本替换当前模式空间。

对电子邮件地址重复上述操作。

注意我第一次尝试使用s/.*//而不是z清空有效但不应该有的行。如果该行不包含电话/电子邮件,则替换应该重置默认正则表达式,并且第二个替换应该反对它不包含反向引用。然而,第二次替换在任何一种情况下都有效。


推荐阅读