对于这个给定的输入:
How to get This line that this word repeated 3 times in THIS line?
But not this line which is THIS word repeated 2 times.
And I will get This line with this here and This one
A test line with four this and This another THIS and last this
我想要这个输出:
How to get This line that this word repeated 3 times in THIS line?
And I will get This line with this here and This one
获取整行仅包含三个重复的“this”字样。(不区分大小写的匹配)
在中,不区分大小写地
perl
替换为自身并计算替换次数:this
改为使用匹配计数:
如果你有 GNU awk,一个非常简单的方法:
字段数将比分隔符数多一个。
在 python 中,这将完成这项工作:
输出:
或者以文件作为参数从文件中读入:
将脚本粘贴到一个空文件中,另存为
find_3.py
,通过命令运行:当然单词“this”可以替换为任何其他单词(或其他字符串或行部分),并且每行出现的次数可以设置为该行中的任何其他值:
编辑
如果文件很大(数十万/数百万行),下面的代码会更快;它每行读取文件而不是一次加载文件:
假设你的源文件是 tmp.txt,
左边的 grep 输出所有在 tmp.txt 中没有出现 4 次或更多次不区分大小写的“this”的行。
结果通过管道传输到右侧 grep,它输出在左侧 grep 结果中出现 3 次或更多次的所有行。
更新:感谢@Muru,这是这个解决方案的更好版本,
将 4 替换为 n+1,将 3 替换为 n。
你可以玩一下
awk
这个:这将返回:
解释
我们所做的是为其
this
自身定义字段分隔符。这样,该行将具有与单词this
出现次数一样多的 +1 字段。为了使其不区分大小写,我们使用
IGNORECASE = 1
. 请参阅参考资料:匹配中的区分大小写。然后,只需要说
NF==4
得到所有那些this
正好有 3 次的行。不需要更多代码,因为{print $0}
(即打印当前行)是awk
表达式求值为 时的默认行为True
。假设这些行存储在一个名为的文件中
FILE
:如果你在 Vim 中:
这只会打印匹配的行。
Ruby 单行解决方案:
以一种非常简单的方式工作:我们将文件重定向到 ruby 的标准输入,ruby 从标准输入获取行,用
chomp
and清理它downcase
,并scan().count
给我们一个子字符串的出现次数。