好的,考虑到我有一个包含以下文本的文件:
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 个单词。
这可能对你有用吗?
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
什么构成一个词?
grep '^[a-z][a-z]* *cat '
如果 . 之后至少有一个空白,这将起作用cat
。如果不能保证,那么:
grep -E '^[a-z]+ +cat( |$)'
它查找cat
后跟空白或行尾。
如果您想要更广泛地定义“第一个单词”(大写、数字、标点符号),请更改字符类。如果您想允许空格或制表符,可以进行更改。如果您可以有前导空格,请*
在插入符号处添加 ' '。根据需要进行变化。
这些变体适用于grep
支持该-E
选项的任何版本。POSIX 不强制使用诸如\S
表示“非空白”之类的符号,尽管 GNUgrep
确实支持将其作为扩展。如果该版本不起作用但存在,则该grep -E
版本将与常规一起使用(不要使用带有 的选项)。egrep
grep -E
egrep
-E
egrep
会更慢,但可能更具可读性:
awk '$2 == "cat"' file
以下应该有效:
grep -e '^\S\+\scat\s'
该行应以长度至少为 1 的非空格开头,后跟一个空格,然后是单词“cat”,后跟一个空格。