Grep 如何在带有regex的文件中搜索匹配的子字符串并仅返回该子字符串?
我有一个50 MB的文件,只有一行。它是损坏的json,我正在搜索子字符串 我对grep有一个问题,它不支持默认语法中的惰性搜索。而且pearl语法在MacOS上似乎不受支持 这是一个基本表达式,它可以工作,但只返回id,而我需要整个对象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'
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版本。还有GNUgrep
,它附带了许多有用的选项,包括-P
。可以使用自制将其安装在macOS上,例如:。