繁体   English   中英

Bash grep变量来自一行中的多个变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM