我有一个文件,类似于:
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
。
对grep
use 的调用-F
使模式被解释为字符串而不是正则表达式。这使得可以计算文件中出现的次数*
,而不必转义*
(您仍然需要引用来*
阻止 shell 将其用作通配模式)。-F
如果您想使用该模式作为正则表达式,请省略。
该-e
选项用于表明grep
这$1
就是模式。如果-e
不使用,类似的模式--version
将被解释为 的选项grep
。
答案2
某些版本的grep
(例如 GNU 的)允许您提供 Perl 兼容的 RE(查看聚合酶链式反应),这些比标准 POSIX 正则表达式灵活得多。