Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash grep变量来自单行上的多个变量_Bash_Variables_Grep - Fatal编程技术网

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

Bash grep变量来自单行上的多个变量,bash,variables,grep,Bash,Variables,Grep,我使用的是GNUBash,版本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。如果两者都匹配,则打印“不匹配” 因此,上面将搜索歌曲标题(雷鬼在我的头脑),然后将确保它有艺术家“沙吉”在

我使用的是GNUBash,版本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。如果两者都匹配,则打印“不匹配”

因此,上面将搜索歌曲标题(雷鬼在我的头脑),然后将确保它有艺术家“沙吉”在同一行,为成功

到目前为止,成功为非变量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-我脑海中的雷鬼音乐。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";}'
将其写入一个文件,使其可执行,并将内容导入其中,第一个命令行选项是您要查找的Artister substring/regex,第二个命令行选项是title substring/regex

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

if ! echo "$pltemp" | egrep '^[^;]+;[^;]*artist[^;]*;.*title'; then
  echo "Not matched"
fi
如果你愿意,你可以把它压缩成一行。或者让它成为一个独立的shell脚本,或者让它成为.bashrc文件中的函数。

如果你真的想“grep this,grep that”,你需要比grep本身更复杂的东西。awk怎么样

awk -F';' '$3~/title/ && $2~/artist/ {print;n=1;exit;} END {if(n=0)print "Not matched";}'
awk -F ';' -v title="$title" -v artist="$artist" '$3 ~ title && $2 ~ artist'
如果您想将此搜索作为脚本进行访问,同样的事情只需更改表单即可。例如:

#!/bin/sh

awk -F';' -vartist="$1" -vtitle="$2" '$3~title && $2~artist {print;n=1;exit;} END {if(n=0)print "Not matched";}'
将其写入一个文件,使其可执行,并将内容导入其中,第一个命令行选项是您要查找的Artister substring/regex,第二个命令行选项是title substring/regex

另一方面,您要寻找的可能只是稍微复杂一点的正则表达式。让我们用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
),路径被剥离,歌曲在主音乐列表中搜索,如果没有找到,它会呼应
“找不到”
,保存到新的播放列表中

作品{已解决}


无论如何,谢谢。

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

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
),路径被剥离,歌曲在主音乐列表中搜索,如果没有找到,它会呼应
“找不到”
,保存到新的播放列表中

作品{已解决}


无论如何,谢谢。

没有正当理由的任意约束,如“我想在一行上做这件事”会导致代码难以理解和维护。“一行”注释可能无意中限制了没有管道的答案,可以说仍然是一行。最简单的答案是通过管道传输多个grep:例如,假设artist=“Marley”,title=“Reggae”(等),然后:answer=$(egrep“$artist”inputfile.txt | egrep“$title”| egrep“$year”|等)。grep regexp可以调整以匹配行中的某些字段。没有正当理由的任意约束,如“我想在一行上执行此操作”会导致代码难以理解和维护。“一行”注释可能无意中限制了没有管道的答案,可以说仍然是一行。最简单的答案是通过管道传输多个grep:例如,假设artist=“Marley”,title=“Reggae”(等),然后:answer=$(egrep“$artist”inputfile.txt | egrep“$title”| egrep“$year”|等)。grep regexp可以调整以匹配行中的某些字段。谢谢ghoti,但是“艺术家”和“标题”未知,您如何在。。。例如,条目为:/Music/New/2000s/2000;UB40;如果它再次发生。mp3/Music/New/1990/1995;齐吉马利;尽情享受吧。MP3他们总有一天会被人知道的,否则你不知道该搜索什么。提供更多的上下文。但也许你的意思是,你将在变量中使用搜索词?我会更新我的答案,但是你的问题越清晰,答案就越清晰。更多信息?好啊以下内容作为“$pltemp”中的行项目/音乐/;Lady Gaga;狗仔队。。。如何使用field3和field2搜索主音乐列表,使其存在于同一行,否则返回“未找到”?而且,只需要使用一行代码。我不确定进入以下代码行的最佳方式…$读取z时回显“$pltemp”;do grep-i-w Musiclists.m3u | grep-i-w | | echo“Not Matched”;这真的很难读。如果是更多信息澄清了问题,请单击问题下方的链接,并用新信息更新问题。StackOverflow注释用于格式化。对答案的合理评论应该是“我已经对我的问题做了更多的澄清;请参见上文。”谢谢ghoti,但是“艺术家”和“头衔”都是未知的,你是如何在。。。例如,条目为:/Music/New/2000s/2000;UB40;如果它再次发生。mp3/Music/New/1990/1995;齐吉马利;尽情享受吧。MP3他们总有一天会被人知道的,否则你不知道该搜索什么。提供更多的上下文。但也许你的意思是,你将在变量中使用搜索词?我会更新我的答案,但是你的问题越清晰,答案就越清晰。更多信息?好啊以下内容作为“$pltemp”中的行项目/音乐/;Lady Gaga;狗仔队。。。如何搜索主音乐列表