[英]Bash grep variable from multiple variables on a single line
我正在使用GNU bash 4.2.20(1)-发行版(x86_64-pc-linux-gnu)。 我有一个音乐文件列表,我将其转储到一个变量中: $pltemp
。
例:
/Music/New/2010s/2011;Ziggy Marley;Reggae In My Head
我希望在Master-Music-List.txt中grep上面的第三个字段,然后为第二个字段继续另一个grep。 如果两个都匹配,则打印否则回显“不匹配”。
因此,上面将搜索歌曲标题(“我头上的雷鬼”),然后确保它在同一行上有艺术家“ Shaggy”,从而获得成功。
到目前为止,非可变grep的成功;
$ grep -i -w -E 'shaggy.*angel' Master-Music-MM-Playlist.m3u
$ if ! grep Shaggy Master-Music-MM-Playlist.m3u ; then echo "Not Found"; fi
$ grep -i -w Angel Master-Music-MM-Playlist.m3u | grep -i -w shaggy
我不确定如何最好地构建“整个”列表以进行处理。
我用它来将列表转储到变量$pltemp
...
原图: \\Music\\New\\2010s\\2011\\Ziggy Marley - Reggae In My Head.mp3
$ pltemp="$(cat Reggae.m3u | sed -e 's/\(.*\)\\/\1;/' -e 's/\(.*\)\ -\ /\1;/' -e 's/\\/\//g' -e 's/\\/\//g' -e 's/.mp3//')"
如果您确实想“ grep this,然后grep that”,则需要比grep本身更复杂的东西。 awk
怎么样?
awk -F';' '$3~/title/ && $2~/artist/ {print;n=1;exit;} END {if(n=0)print "Not matched";}'
如果要使此搜索可作为脚本访问,则只需更改表单即可。 例如:
#!/bin/sh
awk -F';' -vartist="$1" -vtitle="$2" '$3~title && $2~artist {print;n=1;exit;} END {if(n=0)print "Not matched";}'
将此文件写入文件,使其可执行,然后将其填充到文件中,将要查找的艺术家子字符串/正则表达式作为第一个命令行选项,将标题子字符串/正则表达式作为第二个命令行选项。
另一方面,您正在寻找的可能只是稍微复杂一些的正则表达式。 让我们用bash包装它:
if ! echo "$pltemp" | egrep '^[^;]+;[^;]*artist[^;]*;.*title'; then
echo "Not matched"
fi
您可以根据需要将其压缩为一行。 或使其成为独立的Shell脚本,或使其成为.bashrc文件中的函数。
awk -F ';' -v title="$title" -v artist="$artist" '$3 ~ title && $2 ~ artist'
好吧,以上都不是,所以我想出了这个...
for i in *.m3u; do
cat "$i" | sed 's/.*\\//' | while read z; do
grep --color=never -i -w -m 1 "$z" Master-Music-Playlist.m3u \
| echo "#NotFound;"$z" "
done > "$i"-MM-Final.txt;
done
读取每一行( \\Music\\Lady Gaga - Paparazzi.mp3
),剥离路径,在“主音乐列表”中搜索歌曲,如果未找到,则回显"Not Found"
,并保存到新的播放列表中。
作品{已解决}
不管怎么说,还是要谢谢你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.