Regex awk/sed/grep/perl使用字段分隔符,然后仅显示特定行
最近我了解到shairport(airplay emulator)现在创建了一个fifo文件,该文件以以下格式传输元数据:Regex awk/sed/grep/perl使用字段分隔符,然后仅显示特定行,regex,bash,perl,awk,sed,Regex,Bash,Perl,Awk,Sed,最近我了解到shairport(airplay emulator)现在创建了一个fifo文件,该文件以以下格式传输元数据: artist=Justin Bieber title=Baby album=My World 2.0 artwork=cover-2de1df4b978034bcd789ea10b1111a.jpg genre=Pop comment= 我想把它发送到一个lcd显示器上,但我正试图解析它,以显示基本情况: Justin Biebe
artist=Justin Bieber
title=Baby
album=My World 2.0
artwork=cover-2de1df4b978034bcd789ea10b1111a.jpg
genre=Pop
comment=
我想把它发送到一个lcd显示器上,但我正试图解析它,以显示基本情况:
Justin Bieber
Baby
My World 2.0
我尝试使用awk获得上述结果,但如果有人对使用sed、grep、perl或其他任何东西有任何建议,我愿意接受
不管怎样,到目前为止,我已经尝试了很多东西:
awk -F"=" '{print $2}'
要使其显示:
Justin Bieber
Baby
My World 2.0
cover-2de1df4b978034bcd789ea10b1111a.jpg
Pop
很酷,但我真的不需要展示艺术品、流派和评论
这是我用来过滤掉这些额外字段的命令:
awk '!/artwork=/ && !/genre=/ && !/comment=/ && /./'
要打印此文件:
artist=Justin Bieber
title=Baby
album=My World 2.0
现在我只需要将两者结合起来,所以我尝试了这个(更不用说其他一些变体):
但我得到了与上面相同的结果:
artist=Justin Bieber
title=Baby
album=My World 2.0
我知道我遗漏了一些非常基本的东西,但我完全被卡住了。你就快到了,你需要把
-F“=”
放在开头
$ awk -F"=" '!/artwork=/ && !/genre=/ && !/comment=/{print $2}' file
Justin Bieber
Baby
My World 2.0
或
下面的awk将只占用前三行
$ awk -F"=" 'NR<4{print $2}' file
Justin Bieber
Baby
My World 2.0
$awk-F“=”NR只需使用正则表达式power将所有条件合并为一个:
awk -F"=" '!($1 ~ /^(artwork|genre|comment|)$/) {print $2}' file
Perl版本
perl -F/=/ -lane 'print $F[1] if $F[0] =~ /artist|title|album/' file
使用grep
和cut
:
grep -Ev "(artwork|genre|comment)" file | cut -d= -f 2
Justin Bieber
Baby
My World 2.0
使用perl
:
perl -ne '!/(artwork|genre|comment)/ && s/.*=(.*)/$1/g && print' file
使用perl单行程序
perl -ne 'print if s/(artwork|genre|comment)=//' file
说明:
开关:
-n
:为输入文件中的每一行创建while(){…}
循环李>
-e
:告诉perl
在命令行上执行代码李>
抱歉,我无法忍受:这是文件的第一行,awk
和所有其他有音乐品味的脚本语言永远不会接受作为有效输入;)哈,我以为stackoverflow的人会从中得到乐趣。谢谢!我觉得自己很接近,但就是无法得到正确的组合。我曾尝试将-F“=”
放在命令开头的某个位置,但没有正确放置{print$2}
。我的LCD现在可以很好地显示我的轨迹了!非常感谢。我也测试了这个版本。它在终端上打印得很好,但似乎不想通过管道连接到我的LCD。我不知道为什么。也谢谢你!当我测试这个时,我不能让空白行过滤掉。我试着通过这样做来稍微修改它:(artwork |体裁| comment |)
,但这可能真的不合逻辑。只需修改它:awk-F“=”!($1~/^(艺术作品|流派|评论|)$/){print$2}文件
忽略空白行。谢谢。这个版本删除了空白行。我不知道为什么我没有注意到Avinash的第一个建议也没有删除空白行。原来我需要这些空白行,因为我的LCD显示屏显示4行。对于后代:awk-F“=”!($1~/^(艺术作品|流派|评论)/{print$2}'
好的,很高兴知道你的问题已经解决了。你可以点击我的答案左上角的勾号,将这个答案标记为已接受。
perl -ne 'print if s/(artwork|genre|comment)=//' file