首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >提取模式匹配/从行中删除除模式之外的所有内容

提取模式匹配/从行中删除除模式之外的所有内容
EN

Stack Overflow用户
提问于 2019-05-29 07:49:16
回答 4查看 491关注 0票数 2

我目前正在使用grep尝试从文件的每一行提取特定的文本。它成功地提取了匹配,但是,我希望它保留任何没有匹配的行(将它们保留为空行)。

到目前为止,我已经尝试过这样做(在每一行上都有城市的名称):

代码语言:javascript
运行
复制
grep -o -P '(?<="city":").*?(?=")' input.txt

示例输入:

代码语言:javascript
运行
复制
email":"addictedtotlick7@gmail.com","last_name":"THOMPSON","first_name":"ERIN",,"__v":0,,,,"state":"NY","city":"north tonawanda"}
first_name":"chris","last_name":"caul",,"email":"dawgzn@mail.com",,,,"__v":0}
email":"lesliebo993@hotmail.com",,"first_name":"LESLIE","last_name":"RAMBO",,"city":"DOTHAN","state":"AL",,,"__v":0,
email":"malala@yahoo.com",,,"state":"GA","city":"NORCROSS",,"last_name":"KEO","first_name":"CATHY",,"__v":0,
email":"kdela@gmail.com",,"state":"FL","city":"HOLLYWOOD",,"last_name":"DE LA CRUZ","first_name":"KIDA",,"__v":0,

期望产出:

代码语言:javascript
运行
复制
north tonawanda

DOTHAN
NORCROSS
HOLLYWOOD

很高兴在SED中尝试一些更简单的东西,但更愿意避免AWK,因为我必须处理大文件,不确定我有足够的RAM。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-05-29 08:21:57

你可以用GNU awk来做这个。

代码语言:javascript
运行
复制
gawk '{print index($0, "\"city\":\"") == 0 ? "" : gensub(/.*\"city\":\"([^\"]*).*/, "\\1", 1);}' file > newfile

这意味着:如果该行中包含"city":" (index($0, "\"city\":\"") == 0),则(?)打印空行("")或(:)打印gensub(/.*\"city\":\"([^\"]*).*/, "\\1", 1)正则表达式替换的结果:

  • .* -任何0+字符
  • \"city\":\" -一个"city":"子字符串
  • ([^\"]*) -捕获组1 (\1):除"以外的任何0+字符
  • .* -任何0+字符。

结果是Group 1的值,我们需要gensub,因此我们需要GNU,因为我们需要访问捕获组值。

票数 0
EN

Stack Overflow用户

发布于 2019-05-29 15:59:34

您可以尝试Perl。

代码语言:javascript
运行
复制
$ perl -nle ' if(/"city":"(.*?)"/) { print $1 } else { print "" } ' input.txt
north tonawanda

DOTHAN
NORCROSS
HOLLYWOOD

$
票数 1
EN

Stack Overflow用户

发布于 2019-05-29 13:08:13

Sed:

代码语言:javascript
运行
复制
sed 's/.*city":"\([^"]*\).*/|\1/; /^[^|]/s/.*//; s/^|//'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56355517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档