2013-03-24 32 views
0

好了,所以考慮到我有一個包含以下文本的文件:grep的 - 打印包含「貓」作爲第二個字的所有行

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

我需要使用grep只打印包含「貓」作爲行線上的第二個單詞,即第1行和第4行。我嘗試了多個grep -e 'regex' <file>命令,但似乎無法獲得正確的命令。我不知道如何匹配一行中的第N個單詞。

回答

3

這可能適合你嗎?

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 
+0

的確如此!但只是爲了確保我得到了正確的結果:對於擴展的常規exp,將-E放入行開始w用於匹配單詞,+匹配0或更多次,以及\ s + cat \ s是字符串貓? – 2013-03-24 22:54:29

+0

@axesdenied'+'表示'1..n',不是'0..n','*'表示'0..n' – Kent 2013-03-24 22:56:39

0

下面應該工作:

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

該行應與長度的非空白啓動最少1個,後面跟着一個空格和單詞「cat」,後面跟着一個空格。

1

什麼構成一個詞?

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

如果在cat之後至少有一個空白,這將起作用。如果不能保證,那麼:

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

看起來對cat隨後行的空白或結束。

如果您想要更廣泛的'第一個單詞'(大寫,數字,標點符號)的定義,請更改字符類。如果您想允許空格或製表符,則可以進行更改。如果您可以有空白,請在插入處添加'*'。根據需要進行變化。

這些變體可以與支持-E選項的grep的任何版本一起使用。 POSIX沒有強制使用象\S這樣的表示來表示'非空格',儘管GNU grep確實支持這種擴展。如果grep -E不起作用,但egrep存在(請勿使用-E選件與egrep),則grep -E版本將與常規egrep配合使用。

+0

我已經upvoted,因爲這也起作用並且對於學習體驗是有益的:) – 2013-03-24 22:58:55

0

會慢一些,但也許更具可讀性:

awk '$2 == "cat"' file 
相關問題