0

我正在使用 GNU bash,版本 4.2.20(1)-release (x86_64-pc-linux-gnu)。我有一个音乐文件列表,我转储到一个变量中:$pltemp.

例子:

/Music/New/2010s/2011;Ziggy Marley;Reggae In My Head

我希望在 Master-Music-List.txt 中对上面的第三个字段进行 grep,然后为第二个字段继续另一个 grep。如果两者都匹配,则打印 else echo "Not Matched"。

因此,上面将搜索歌曲标题(Reggae In My Head),然后确保它在同一行中有艺术家“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//')"
4

3 回答 3

4

如果你真的想“grep this, then 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 文件中的一个函数。

于 2012-06-08T04:25:06.353 回答
0
awk -F ';' -v title="$title" -v artist="$artist" '$3 ~ title && $2 ~ artist'
于 2012-06-08T04:25:23.040 回答
0

好吧,以上都不起作用,所以我想出了这个......

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",保存到新的播放列表中。

作品{已解决}

不管怎么说,还是要谢谢你。

于 2012-06-09T00:01:25.113 回答