为什么这个 grep 语句与我期望的相反?

Joe*_*moe 11 linux grep html whitespace text

我有一个包含一些 HTML 和一些文本的文件,我只想使用文本行。

我在玩弄grep,试图找到一种方法来排除以 HTML 标记开头的行,甚至是在标记前包含空格的行。

不知何故这对我有用,但我认为它不应该:

grep '^\<' file.htm

它只是向我显示没有 html 的行。你能解释一下为什么吗?我想我需要grep -v一些.*地方来完成这项工作。

Kam*_*ski 15

GNUgrep手册

\<
匹配单词开头的空字符串。

\>
匹配单词末尾的空字符串。

这也是相关的[强调我的]:

-w
--word-regexp
仅选择包含构成整个单词的匹配项的那些行。测试是匹配的子字符串必须位于行首或前面是非单词组成字符。同样,它必须位于行尾或后跟非单词组成字符。单词组成字符是字母、数字和下划线。[…]

因为该-w选项可以匹配不以单词成分开头和结尾的子字符串,所以它不同于用\<和包围正则表达式\>。例如,尽管grep -w @只匹配包含线@grep '\<@\>'不能因为匹配任何线@是不是一个字组成。[…]

为了完整性:

插入符号^和美元符号$是元字符,分别匹配行首和行尾的空字符串。它们被称为锚点,因为它们分别强制匹配“锚定”到一行的开头或结尾。

您使用的模式 ( ^\<) 匹配单词组成字符之前的行首。<字符和空格都不是单词成分。

请注意,行首的空格不会触发匹配,无论后面是否有标签或其他内容。一些对文本行有效的字符也不会触发匹配(例如()。