如何使 Grep 非贪婪

如何使 Grep 非贪婪

我有一个文件,类似于:

helsoidfiejoih
heye heye hey 
me is hi

该文件可以包含任意数量的行或字符,重点是它是某种文本文件。现在我需要使用 grep 来做一些操作,以便传递给 grep 的第一个参数是文件名,第二个参数是模式。但是 grep 进行贪婪匹配,因此它匹配整行,而不是我想要的非贪婪匹配(非贪婪匹配)。现在我尝试了:

grep -Ec -Po "$2" $1

它给了我矛盾的表达。用户可以输入任何模式(AKA RE),因此 -E 是必要的选项。有没有办法让 grep 非贪婪?有人告诉我 -P 选项使 grep 命令不贪婪,但在尝试之后:

grep -c -Po "$2" $1

它似乎并没有使 grep 表达式变得非贪婪?

编辑:人们说我没有显示我正在使用的模式,因此为了澄清这些模式将是一个 RE,例如,如果用户输入

./thisfile.sh h file1.txt

它将查找 h 在 file1.txt 中出现的次数 如果用户输入

./thisfile.sh io file1.txt

它将查找 io 在 file1.txt 中出现的次数。有没有办法做到这一点?

答案1

计算子字符串在文件中出现的次数:

#!/bin/sh

grep -F -o -e "$1" | wc -l

您可以像这样使用这个脚本:

$ ./script e <script
       2
$ ./script ' -' <script
       4
$ ./script hey <file1
       3
$ ./script he <file1
       4
$ df | ./script %
       7

这里我计算脚本本身的字符数e,然后计算由空格和破折号组成的子字符串在脚本中出现的次数。然后我计算问题中提供的文件中的几个子字符串。最后一个示例计算df我的系统输出中百分号的数量。

输入数据是通过标准输入读取的,脚本的唯一参数是我们要查找和计数的子字符串。

该脚本由单个grep+wc管道组成。它使用非标准(但通常实现) -o选项返回单独行上的非重叠匹配列表。然后用 来对这些行进行计数wc -l

grepuse 的调用-F使模式被解释为字符串而不是正则表达式。这使得可以计算文件中出现的次数*,而不必转义*(您仍然需要引用*阻止 shell 将其用作通配模式)。-F如果您想使用该模式作为正则表达式,请省略。

-e选项用于表明grep$1就是模式。如果-e不使用,类似的模式--version将被解释为 的选项grep

答案2

某些版本的grep(例如 GNU 的)允许您提供 Perl 兼容的 RE(查看聚合酶链式反应),这些比标准 POSIX 正则表达式灵活得多。

相关内容