2015-11-27 74 views
1

我想弄清楚爲什麼這不起作用,當然如何解決它,我有一個變量中的日期很長的列表,並希望計算使用grep的出現次數,看起來像在新行上分割變量不能按預期工作?例如,使用grep解析多行變量

$ list="2015-a 2015-b 2016-a" ; count=`echo $list | tr " " \\n | grep 2015 | wc -l` ; echo $count 
1 


$ list="2015-a,2015-b,2016-a" ; count=`echo $list | tr , \\n | grep 2015 | wc -l` ; echo $count 
1 


$ list="2015-a,2015-b,2016-a" ; count=`echo $list | sed s/,/\\n/g | grep 2015 | wc -l` ; echo $count 
1 

任何想法?

+1

'echo「2015-a 2015-b 2016-a」| grep -o「2015」| wc -l' – 123

+0

如果你說'tr「」「\ n」',它就可以工作。 – fedorqui

+0

順便說一下,對於那些檢查這個問題的人:有一個同義詞請求將'tr'合併到'html-table'中。投票! http://stackoverflow.com/tags/html-table/synonyms更多信息[我們可以取消建議讓[tr]成爲[html-table]的同義詞嗎?](http://meta.stackoverflow.com/ q/311194/1983854) – fedorqui

回答

1

問題是與反引號的方式解釋\\

反斜槓()內反引號以非顯而易見的方式進行處理:

$ echo "`echo \\a`" "$(echo \\a)" 
    a \a 
    $ echo "`echo \\\\a`" "$(echo \\\\a)" 
    \a \\a 
    # Note that this is true for *single quotes* too! 
    $ foo=`echo '\\'`; bar=$(echo '\\'); echo "foo is $foo, bar is $bar" 
    foo is \, bar is \\ 

說所以不是:

$ echo "`echo $list | tr " " \\n`" 
2015-an2015-bn2016-a 

你必須說:

$ echo "`echo $list | tr " " \\\\n`" 
2015-a 
2015-b 
2016-a 

即使是最好用$()因爲反引號被棄用:

$ echo "$(echo $list | tr " " '\n')" 
2015-a 
2015-b 
2016-a 

如果你還是想用反引號,最乾淨的解決方案是使用" "作爲一個包裝,而不是這樣的逃逸\\\\

$ echo "`echo $list | tr " " "\n"`" 
2015-a 
2015-b 
2016-a 

所有這一切都可以在Why is $(...) preferred over ... (backticks)?讀取。


總而言之,如果你只是想看看有多少字包含2015的建議中評或者也可以是更強大的這樣awk您可以考慮使用grep -o

awk '{for (i=1;i<=NF;i++) if ($i~2015) count++; print count}' 

看到一些示例:

$ awk '{for (i=1;i<=NF;i++) if ($i~2015) s++; print s}' <<< "2015-a 2015-b 2016-a"    2 
$ awk '{for (i=1;i<=NF;i++) if ($i~2015) s++; print s}' <<< "2015-a 2015-b 2016-a 20152015-c" 
3