2016-11-18 2 views
0

Я пытаюсь получить текущий трек работает от «CMus-дистанционного -Q» Сво всегда под этой линииBash - Grep только линия после

tag genre Various 
<some track> 

Теперь мне нужно держать его просто потому что я хочу добавить его в свою панель i3.

Я использовал

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

но Grep это 'метка' линия и линия внизу.

Я хочу ТОЛЬКО линию под ней.

+0

А что только за исключением RE с другой трубой? 'cmus-remote -Q | grep -A 1 "tag genre" | grep -v "tag genre" '? Это терпит неудачу, если RE находится на двух строках подряд, конечно. – ghoti

+0

Если ваш 'grep' поддерживает опцию' -P', тогда это так просто, жанр тегов grep -oPz. * \ N \ K. * 'file' –

ответ

0

Если вы хотите использовать grep в качестве инструмента для этого, вы можете достичь его, добавив еще один сегмент вашего трубопровода:

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

Это потерпит неудачу в тех случаях, когда строка, которую вы ищете на двух строках я n строка. Вы должны будете определить, какое поведение вы хотите в этом случае, если мы собираемся запрограммировать что-то разумное для этого.

Другой возможностью было бы использовать такой инструмент, как awk, что позволяет более макетов в выборе линии:

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

Это ищет строки, а затем получает следующую строку, а затем выводит его.

Другой возможностью было бы сделать это в одиночку Баш:

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> 
Смежные вопросы