Bash grep变量来自单行上的多个变量

时间:2012-06-08 04:10:54

标签: bash variables grep

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

示例:

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

我希望grep上面的第3个字段,在Master-Music-List.txt中,然后为第2个字段继续另一个grep。如果两者匹配,则打印否则回显“未匹配”。

因此,上面将搜索歌曲标题(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//')"

3 个答案:

答案 0 :(得分:4)

如果你真的想要“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";}'

将此文件写入文件,使其成为可执行文件,然后将其填充到文件中,使用您要查找的艺术家substring / regex作为第一个命令行选项,将标题substring / regex作为第二个。

另一方面,你正在寻找的可能只是一个稍微复杂的正则表达式。让我们用bash包装它:

if ! echo "$pltemp" | egrep '^[^;]+;[^;]*artist[^;]*;.*title'; then
  echo "Not matched"
fi

如果您愿意,可以将其压缩为一行。或者使它成为一个独立的shell脚本,或者将其作为.bashrc文件中的函数。

答案 1 :(得分:0)

awk -F ';' -v title="$title" -v artist="$artist" '$3 ~ title && $2 ~ artist'

答案 2 :(得分: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",保存到新的播放列表中。

作品{已解决}

非常感谢。