2016-11-18 59 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>