2016-11-18 61 views
0

我試圖擺脫「的CMU-遙控-Q」運行 它總是此行巴什 - 之後的grep只有線路

tag genre Various 
<some track> 

現在的下方當前曲目,我需要保持簡單因爲我想將它添加到我的i3欄。

我用

cmus-remote -Q | grep -A 1 "tag genre" 

但grep的是 '標籤' 線和下面的線。

我只想要下面的線。

+0

什麼只是排除了RE與另一個管? 'cmus-remote -Q | grep -A 1「標籤流派」| grep -v「標籤流派」'?當然,如果RE連續在兩行上,它就會失敗。 – ghoti

+0

如果你的'grep'支持'-P'選項,那麼它很簡單,'grep -oPz'標籤類型。* \ n \ K. *'文件' –

回答

0

的行數如果你想使用grep作爲這個工具,你可以通過添加另一個段您的管道實現它:

cmus-remote -Q | grep -A 1 "tag genre" | grep -v "tag genre" 

這將在情況下,你要搜索的字符串是兩行失敗我一排。在這種情況下,如果我們要編寫一些合理的代碼,就必須定義你想要的行爲。

另一種可能是使用像awk一個工具,它允許更大的compexity在線路選擇:

cmus-remote -Q | awk '/tag genre/ { getline; print }' 

此搜索字符串,然後獲取下一行,然後打印。

另一種可能性是獨自做到這在bash:

while read line; do 
    [[ $line =~ tag\ genre ]] && read line && echo "$line" 
done < <(cmus-remote -Q) 

這實現相同的功能的awk腳本,只有不使用外部工具都沒有。它可能比awk腳本慢。

0

可以使用awk代替grep

awk 'p{print; p=0} /tag genre/{p=1}' file 

<some track> 
  • /tag genre/{p=1} - 設置標誌p=1當它在一條線上遇到tag genre
  • p{print; p=0}p非零時,它打印一行並將p重設爲0
+0

謝謝,這也適用,但我認爲grep -v ,只是更容易:< – KeVy0

+1

嗯,但它調用2個命令,而不是隻有一個與awk – anubhava

+1

好吧,公平的:)。謝謝 – KeVy0

0

我建議用awk:

awk 'seen && seen--; /tag genre/ { seen = 1 }' 
  • seen是真實的,打印就行了。
  • seen是真實的,遞減的值,所以它會不再是真實的被打印的行的期望數量後
  • 模式匹配時,設定seen到要被打印
0

隨着sed

sed -n '/tag genre/{n;p}' 

輸出:

$ cmus-remote -Q | sed -n '/tag genre/{n;p}' 
<some track>