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