1

我正在尝试在文件中搜索完全匹配的字符串。我知道它可以通过“grep -w”来完成,但由于某种原因,我不使用 grep 来完成。

已经尝试过这些并没有为我工作:

egrep '\< pattern \>' file
fgrep '\< pattern \>' file
egrep '^pattern$' file
fgrep '^pattern$' file

例子:

我只想显示包含“ABC100-10”字符串的行

$ cat file
NULL1 VOID XX
NULL2 VOID XX
EMPTY VOID XX
ABC100-10 VOID XX
ABC100-102 VOID XX

当我尝试这个时:

egrep ABC100-10 file

实际输出:

ABC100-10 VOID XX
ABC100-102 VOID XX

预期产出

ABC100-10 VOID XX

带字边界:

egrep '\<ABC100-10\>' file

没有输出。预期输出:

ABC100-10 VOID XX

带有开始/结束行边界:

egrep '^ABC100-10$' file

没有输出。预期输出:

ABC100-10 VOID XX

顺便说一句,我使用的是 Solaris 8。任何帮助将不胜感激。

4

2 回答 2

1

egrep使用正则表达式,即反斜杠、插入符号、美元符号等字符具有特殊含义。fgrep使用文字字符串。要查看差异:

$ cd -- "$(mktemp --directory)" 
$ echo 'Bebop' > foo.txt
$ echo '$variable' > bar.txt
$ egrep '^Be' foo.txt || echo 'Not found'
Bebop
$ fgrep '^Be' foo.txt || echo 'Not found'
Not found
$ egrep '$var' bar.txt || echo 'Not found'
Not found
$ fgrep '$var' bar.txt || echo 'Not found'
$variable

如果不清楚,请提供实际的命令和内容file、结果以及您希望看到的内容。

更新:默认情况下,anygrep将打印模式匹配行上任何位置的每一行grep不像谷歌那样做单词搜索,它只是寻找字符串。因此,如果您想搜索您需要使用的单词 (如您尝试的那样)或. 我认为您必须使用不支持and的版本,因为它在这里按预期工作。ABC100-10egrep '\<ABC100-10\>'egrep '\bABC100-10\b'grep\<\>

^并分别表示line$的开始和结束,因此它们只会打印仅包含它们之间的字符串的行。例如,要搜索空行,您可以使用.egrep '^$'

于 2013-05-23T09:51:02.020 回答
1

这个可以吗 ?

grep "\bABC100-10\b" file

如果 grep 在 Solaris 上工作异常,您可以使用 perl

perl -ne 'print if /\bABC100-10\b/' file

\b 表示单词边界

于 2013-05-23T10:29:58.963 回答