Grep 如何在带有regex的文件中搜索匹配的子字符串并仅返回该子字符串?

Grep 如何在带有regex的文件中搜索匹配的子字符串并仅返回该子字符串?,grep,Grep,我有一个50 MB的文件,只有一行。它是损坏的json,我正在搜索子字符串 我对grep有一个问题,它不支持默认语法中的惰性搜索。而且pearl语法在MacOS上似乎不受支持 这是一个基本表达式,它可以工作,但只返回id,而我需要整个对象 grep-o'1234'大文件 以下是我尝试过的一些不起作用的东西 grep-oP'1234.*?globalId'largefile p不受支持 grep-F'1234'大文件| grep-o-E.{30}1234.{500}' 重复计数无效 grep-o'

我有一个50 MB的文件,只有一行。它是损坏的json,我正在搜索子字符串

我对grep有一个问题,它不支持默认语法中的惰性搜索。而且pearl语法在MacOS上似乎不受支持

这是一个基本表达式,它可以工作,但只返回id,而我需要整个对象

grep-o'1234'大文件

以下是我尝试过的一些不起作用的东西

grep-oP'1234.*?globalId'largefile

p不受支持

grep-F'1234'大文件| grep-o-E.{30}1234.{500}'

重复计数无效

grep-o'1234.{100}大文件

不归还任何东西


如何进行此搜索?它不需要是grep。有时我会读到关于
awk
perl
ripgrep
和其他我从来没有理由尝试的东西。

如果
grep-p
不受支持,请使用perl一行程序。例如,这将打印parens中捕获的所有匹配,每行1个匹配:

perl -lne 'print for /(1234.*?globalId)/g' in_file

另一种选择是使用非匹配来进行延迟抓取

此解决方案的限制是,您不能将
G
介于
1234
GlobalId

例如:

 text="prefix 12345 some text 12345 some text 2 GlobalId more text 3 GlobalId suffix"

 echo "$text" | grep -o  "1234[^G]\+GlobalId"
 12345 some text 12345 some text 2 GlobalId

 echo "$text" | grep -oP  "1234.+?GlobalId"
 12345 some text 12345 some text 2 GlobalId

了解更多有关此技巧的信息。

在MacOS上安装
pcregrep
。对于您的操作系统来说,它是一个更好的
grep
版本。如果可以的话,我要问一个后续问题:对于这类任务,您认为使用perl和ripgrep怎么样?我可以用您的解决方案和\u文件中的
rg-o'1234.*?global.
解决这个问题。它们看起来很相似,所以我不知道将来我想用哪种工具来处理这类问题tasks@user1283776与ripgrep相比,我更喜欢使用Perl,因为Perl是一种非常有表现力的语言,在这种语言中,您可以将很多内容打包到一行程序(或者几乎是一行程序)中。可以将多个模式搜索和替换组合到一个命令中。Perl预装在macOS中(通常是旧版本)。可以使用
conda
perlbrew
安装和维护较新的Perl版本。还有GNU
grep
,它附带了许多有用的选项,包括
-P
。可以使用
自制
将其安装在macOS上,例如:。