【问题标题】:Grep ignore special characters before applying regular expressionGrep 在应用正则表达式之前忽略特殊字符
【发布时间】:2019-06-28 15:00:23
【问题描述】:

一般

我正在尝试在特定目录下的数百个 JSON 文件中递归搜索与特定正则表达式匹配的行。

grep -rh 非常适合递归搜索特定行。我在将正则表达式应用于搜索时遇到问题,因为 JSON 文件中的所有行都以 " 开头并以 "、"。

示例:如果我想应用正则表达式来获取所有以 zxc 开头的行,我将无法做到,因为这些行实际上以 "zxc 开头强>

代码

如果行的开头没有",则以下命令将起作用。

/bin/grep -rh -E "^(zxc)" "/etc/json_dir/"

以下命令有效,但我不希望 grep 从所有 JSON 文件中获取数十万行,然后应用正则表达式。

/bin/grep -rh -E ".*" "/etc/json_dir/" | /bin/sed -e 's/^"//g' -e 's/,$//g' -e 's/"$//g' | /bin/grep -E "^(zxc)"

问题

grep 有没有办法忽略开头的 " 字符和行尾的 "", 字符在应用正则表达式之前?

如果没有办法,有没有办法用其他 bash 命令、perl、python 或其他语言来做到这一点。

【问题讨论】:

  • 使用可以正确处理 JSON 的工具。使用jq 而不是grepsedawk ...
  • 同意赛勒斯。尽管如此:grep -E '^"?zxc' ... 将在行首处理 optional 引号。

标签: json bash shell grep


【解决方案1】:

如果我正确理解您的问题,您可以使用awk

awk '{gsub(/^"|"$/,"") } # this part removes all the "s from the start and end of line
     /^WHAT/ { print } # or any other processing
     ' **/*.json

注意**/* 需要(现代)bash 中的 globestar 递归通配选项。

Ideone查看它的实际应用。

您可以将其缩短为:

awk '/^"?WHAT/' **/* # this executes the default printing action 

awk|sed|grep 可能不是搜索 JSON 的正确工具。

【讨论】:

  • 哇哦,这个 awk 命令太棒了。感谢您的分享。这应该为我做。我实际上使用 jq 来解析 JSON,但我不知道 jq 在不使用循环的情况下一次读取许多 JSON 文件。也许我应该对此进行一些研究。
猜你喜欢
  • 1970-01-01
  • 2015-06-25
  • 2014-03-04
  • 2021-10-09
  • 1970-01-01
  • 2016-09-11
  • 2013-11-23
  • 2021-06-04
  • 1970-01-01
相关资源
最近更新 更多