代码之家  ›  专栏  ›  技术社区  ›  Ricardo Marimon

使用SED组合两个特定行

  •  0
  • Ricardo Marimon  · 技术社区  · 14 年前

    我有以下输入文件,您可以将其识别为Debian Packages 文件:

    Package: nimbox-apexer-sales
    Version: 1.0.0-201007241449
    Architecture: i386
    Maintainer: Ricardo Marimon <rmarimon@nimbox.com>
    Installed-Size: 124
    Depends: nimbox-apexer-root
    Filename: binary/nimbox-apexer-sales_1.0.0-201007241449_i386.deb
    Size: 68880
    MD5sum: c4538f2913d76b57110ba73d0b87cc16
    Section: base
    Priority: optional
    Description: Sales Application for NiMbox.
    
    Package: nimbox-tomcat
    Version: 6.0.26-5
    Architecture: i386
    Maintainer: Ricardo Marimon <rmarimon@nimbox.com>
    Installed-Size: 6144
    Depends: sun-java6-jdk
    Filename: binary/nimbox-tomcat_6.0.26-5_i386.deb
    Size: 5490024
    MD5sum: 5f2ccbe6137af2842e1c81bc217444e3
    Section: base
    Priority: optional
    Description: Tomcat Servlet Application Server for NiMbox
     NiMbox requires a servlet application server in order to work.  The current
     NiMbox implementation requires a Tomcat Servlet Application.
    

    这个文件实际上有很多这样的条目,我想得到下面的文件

    nimbox-apexer-sales 1.0.0-201007241449
    nimbox-tomcat 6.0.26-5
    

    在哪里 Package 以及 Version 被一个 tab 以便以后使用 cut 去拿它们。我很确定这可以用 sed . 我看了一下SED一行程序,但这可能有点复杂。有什么想法吗?

    6 回复  |  直到 13 年前
        1
  •  1
  •   rafl    14 年前

    使用Debian软件包文件时,您可能会发现 grep-dctrl 有用。它在允许限制数据的两个方面都非常灵活 输出,以及如何输出。而不是尝试解析包 文件格式我自己,我只是问 GREP DCTRL公司 为我做,只打印 我真正感兴趣的信息包括:

    $ grep-dctrl -n -s Package,Version nimbox /var/lib/apt/lists/..._Packages
    

    这会给你带来如下好处:

    nimbox-apexer-sales
    1.0.0-201007241449
    
    nimbox-tomcat
    6.0.26-5
    

    有了它,只需要把正确的线连接起来,这很容易 例如,Perl就足够了:

    $ ... |perl -pi -0e's/(?<!^)\n(?!\n)/ /mg; s/\n\n/\n/g'
    nimbox-apexer-sales 1.0.0-201007241449
    nimbox-tomcat 6.0.26-5
    

    或者您碰巧喜欢的其他任何一组标准的Unix工具。

    当然可以直接从包文件格式转到 想要,但对我来说,使用专门用于工作的工具似乎是个好主意。

        2
  •  1
  •   user405725    14 年前

    假设您的文件名为test.txt:

    grep -P '^Package: |^Version:' test.txt  | awk '{ print $2 }' | sed -e 'N;s/\n/ /'
    

    在哪里?

    1. grep-p'^包:^版本:''- 以“package:”或“version:”开头的行的greps
    2. awk'打印$2'-条带 'package:'和'version:' 结果的子字符串
    3. sed-e'n;s/\n//'-联接间隔 其他行
        3
  •  1
  •   trevor    14 年前

    纯SED解决方案(在Mac OS X上使用FreeBSD SED):

    # See: 
    # http://sed.sourceforge.net/sedfaq3.html#s3.3: ... (6) Relentless ...
    # http://sed.sourceforge.net/sed1line.txt: ... # if a line begins with ...
    
    sed -n '/^Package:/{
    :a
    N
    /\nVersion:/!ba
    p
    }' file |
    sed -E -e :a -e $'$!N;s/\\nVersion: */\t/;ta' -e 'P;D' |
    sed -e 's/^Package: *//'
    
        4
  •  1
  •   dheerosaur    14 年前

    以下是SED版本:

      sed -ne 's/Package: \(.*\)/\1/p' 
          -ne 's/Version: \(.*\)/\1/p' < filename
          | sed 'N;s/\n/ /g'
    
        5
  •  0
  •   gawi    14 年前

    使用RPMS,解决方案应该是:

    rpm -qa --queryformat "%{NAME}\t%{VERSION}\n"
    

    对SED挑战来说太糟糕了。

        6
  •  0
  •   potong    13 年前

    这可能对您有用:

    sed '/Package:/!d;N;s/^[^ ]* //mg;y/\n/\t/' filename
    nimbox-apexer-sales     1.0.0-201007241449
    nimbox-tomcat   6.0.26-5
    

    此外,如果您注意到可以从 Filename: 线:

    sed '/Filename:/!d;s,.*/\([^_]*\)_\([^_]*\).*,\1\t\2,' filename
    nimbox-apexer-sales     1.0.0-201007241449
    nimbox-tomcat   6.0.26-5
    

    这可能是GNU SED特定的!