1

好的,考虑到我有一个包含以下文本的文件:

lknsglkn cat lknrhlkn lsrhkn
cat lknerylnk lknaselk cat
awiooiyt lkndrhlk dhlknl
blabla cat cat bla bla

我需要使用 grep 仅打印包含“cat”作为该行的第二个单词的行,即第 1 行和第 4 行。我尝试了多个grep -e 'regex' <file>命令,但似乎无法获得正确的命令。我不知道如何匹配一行的第 N 个单词。

4

4 回答 4

4

这可能对你有用吗?

grep -E '^\w+\s+cat\s' file

如果第一个“单词”可以包含一些非单词字符,例如"#, (,[..",您也可以尝试:

grep -E '^\S+\s+cat\s' file

使用您的示例输入:

kent$  echo "lknsglkn cat lknrhlkn lsrhkn
cat lknerylnk lknaselk cat
awiooiyt lkndrhlk dhlknl
blabla cat cat bla bla"|grep -E '^\S+\s+cat\s'
lknsglkn cat lknrhlkn lsrhkn
blabla cat cat bla bla
于 2013-03-24T22:51:39.753 回答
1

什么构成一个词?

grep '^[a-z][a-z]*  *cat '

如果 . 之后至少有一个空白,这将起作用cat。如果不能保证,那么:

grep -E '^[a-z]+ +cat( |$)'

它查找cat后跟空白或行尾。

如果您想要更广泛地定义“第一个单词”(大写、数字、标点符号),请更改字符类。如果您想允许空格或制表符,可以进行更改。如果您可以有前导空格,请*在插入符号处添加 ' '。根据需要进行变化。

这些变体适用于grep支持该-E选项的任何版本。POSIX 不强制使用诸如\S表示“非空白”之类的符号,尽管 GNUgrep确实支持将其作为扩展。如果该版本不起作用但存在,则该grep -E版本将与常规一起使用(不要使用带有 的选项)。egrepgrep -Eegrep-Eegrep

于 2013-03-24T22:54:27.060 回答
0

会更慢,但可能更具可读性:

awk '$2 == "cat"' file
于 2013-03-25T00:27:44.743 回答
0

以下应该有效:

grep -e '^\S\+\scat\s'

该行应以长度至少为 1 的非空格开头,后跟一个空格,然后是单词“cat”,后跟一个空格。

于 2013-03-24T22:53:35.497 回答