Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/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
Regex awk/sed/grep/perl使用字段分隔符,然后仅显示特定行_Regex_Bash_Perl_Awk_Sed - Fatal编程技术网

Regex awk/sed/grep/perl使用字段分隔符,然后仅显示特定行

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

最近我了解到shairport(airplay emulator)现在创建了一个fifo文件,该文件以以下格式传输元数据:

   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