我试图让当前的曲目从“cmus-remote -Q' 它总是在这一行的下面
tag genre Various
<some track>
现在,我需要保持简单,因为我想将它添加到我的i3栏。我用了
cmus-remote -Q | grep -A 1 "tag genre"
但是那个grep&#39;标签&#39;线和下面的线。
我只想要下面的一行。
答案 0 :(得分: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
。答案 1 :(得分:0)
我建议使用awk:
awk 'seen && seen--; /tag genre/ { seen = 1 }'
seen
为真时,请打印该行。seen
为真时,递减该值,因此在打印所需的行数后它将不再为真seen
设置为要打印的行数答案 2 :(得分:0)
如果您想使用grep
作为此工具,可以通过向管道添加其他细分来实现:
cmus-remote -Q | grep -A 1 "tag genre" | grep -v "tag genre"
如果您要搜索的字符串连续两行,则会失败。如果我们打算为它编写一些合理的东西,你必须定义你想要的行为。
另一种可能性是使用像awk
这样的工具,这样可以在行选择中实现更大的复杂性:
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脚本慢。
答案 3 :(得分:0)
使用sed
:
sed -n '/tag genre/{n;p}'
输出:
$ cmus-remote -Q | sed -n '/tag genre/{n;p}'
<some track>