为什么这个 grep 语句的效果与我的预期相反?

为什么这个 grep 语句的效果与我的预期相反?

我有一个文件,其中混合了一些 HTML 和一些文本,我只想使用文本行。

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

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

grep '^\<' file.htm

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

答案1

GNUgrep手册

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

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

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

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

由于该-w选项可以匹配不以单词成分开头和结尾的子字符串,因此它不同于用\<and包围正则表达式\>。例如,虽然grep -w @匹配仅包含 的行@,但grep '\<@\>'无法匹配任何行,因为@不是单词成分。 […]

为了完整性:

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

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

请注意,行首的空格不会触发匹配,不管如果后面有标签或其他东西。某些对文本行有效的字符也不会触发匹配(例如()。

相关内容