- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
注意:
在我开始做正事之前,我想指出一些其他的 SO 帖子,它们没有完全回答我的问题并且不是这个帖子的重复:
背景:
我在名为 words.txt
的文件中有一个单词列表(每行一个单词)。我想从一个更大的文件 file.txt
中找到所有行,该文件包含 words.txt
中的任何单词。但是,我只想要全字 匹配。这意味着当来自 file.txt
的一行包含至少一个来自 words.txt
的单词“完全独立”的实例时,应该进行匹配(我知道这是含糊不清的,所以请允许我解释一下)。
换句话说,应该在以下情况下进行匹配:
例如,如果 words.txt
中的单词之一是 cat
,我希望它的行为如下:
cat #=> match
cat cat cat #=> match
the cat is gray #=> match
mouse,cat,dog #=> match
caterpillar cat #=> match
caterpillar #=> no match
concatenate #=> no match
bobcat #=> no match
catcat #=> no match
cat100 #=> no match
cat-in-law #=> no match
先前的研究:
有一个grep
命令几乎 适合我的需要。具体如下:
grep -wf words.txt 文件.txt
选项在哪里:
-w, --word-regexp
Select only those lines containing matches that form whole words.
The test is that the matching substring must either be at the beginning
of the line, or preceded by a non-word constituent character.
Similarly, it must be either at the end of the line or followed by a
non-word constituent character. Word-constituent characters are
letters, digits, and the underscore.
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file contains
zero patterns, and therefore matches nothing.
我遇到的最大问题是它将连字符(即 -
)视为“非单词组成字符”。因此(基于上面的示例)对 cat
进行全词搜索将返回 cat-in-law
,这不是我想要的想要。
我意识到 -w
选项可能达到了很多人想要的效果。但是,在我的特殊情况下,如果一个词(例如 cat
)后跟/前面有一个连字符,那么我需要将其视为更大词的一部分(例如 cat- in-law
) 而不是这个词本身的一个实例。
此外,我知道我可以更改 words.txt
以包含正则表达式而不是固定字符串,然后使用:
grep -Ef words.txt file.txt
在哪里
-E, --extended-regexp
Interpret PATTERN as an extended regular expression
但是,我想避免更改 words.txt
并使其不包含正则表达式模式。
问题:
是否有一个简单的 bash 命令可以让我给它一个单词列表并对文本正文执行全词匹配?
最佳答案
我终于想到了解决办法:
grep -Ef <(awk '{print "([^a-zA-Z0-9-]|^)"$0"([^a-zA-Z0-9-]|$)"}' words.txt) file.txt
解释:
words.txt
是我的单词列表(每行一个)。file.txt
是我要搜索的文本正文。awk
命令将预处理 words.txt
即时,将每个单词包装在一个特殊的正则表达式中以定义其正式的开始和结束(基于我上面问题中发布的规范)。 awk
命令被 <(
包围和 )
以便其输出用作 -f
的输入选项。-E
选项,因为我现在输入的是正则表达式列表,而不是来自 words.txt
的固定字符串.这里的好处是 words.txt
可以保持人类可读性,并且不必包含一堆正则表达式模式。
关于regex - 给定单词列表,对文本正文进行全词匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30470371/
我是一名优秀的程序员,十分优秀!