Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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 使用sed组合两个特定行_Bash_Shell_Sed_Debian - Fatal编程技术网

Bash 使用sed组合两个特定行

Bash 使用sed组合两个特定行,bash,shell,sed,debian,Bash,Shell,Sed,Debian,我有以下输入文件,您可能会将其识别为debianPackages文件: 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-sal

我有以下输入文件,您可能会将其识别为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.

其中,
版本
由一个
选项卡
分隔,以便我以后可以使用
剪切
来获取它们。我很确定这可以通过
sed
实现。我浏览了sed一行程序,但这可能有点复杂。有什么想法吗?

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

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

  • grep-P“^Package:| ^Version:”- greps表示以“Package:”或“Version:”开头的行
  • awk'{打印$2}'-条 '程序包:'和'版本:' 结果的子字符串
  • sed-e'N;s/\n/'-加入每个 其他线路

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

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

  • grep-P“^Package:| ^Version:”- greps表示以“Package:”或“Version:”开头的行
  • awk'{打印$2}'-条 '程序包:'和'版本:' 结果的子字符串
  • sed-e'N;s/\n/'-加入每个 其他线路

  • 使用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
    

    $|perl-pi-0e/(?在使用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
    

    $…| perl-pi-0e/(?使用RPM,解决方案是:

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

    对于sed挑战来说太糟糕了。

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

    rpm -qa --queryformat "%{NAME}\t%{VERSION}\n"
    
    对于sed挑战来说太糟糕了。

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

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

    以下是sed版本:

      sed -ne 's/Package: \(.*\)/\1/p' 
          -ne 's/Version: \(.*\)/\1/p' < filename
          | sed 'N;s/\n/ /g'
    
    sed-ne的/Package:\(.*\)/\1/p'
    -ne的/版本:\(.*\)/\1/p'
    以下是sed版本:

      sed -ne 's/Package: \(.*\)/\1/p' 
          -ne 's/Version: \(.*\)/\1/p' < filename
          | sed 'N;s/\n/ /g'
    
    sed-ne的/Package:\(.*\)/\1/p'
    -ne的/版本:\(.*\)/\1/p'
    这可能适合您:

    sed '/Package:/!d;N;s/^[^ ]* //mg;y/\n/\t/' filename
    nimbox-apexer-sales     1.0.0-201007241449
    nimbox-tomcat   6.0.26-5
    
    另外,如果您注意到可以从
    文件名:
    行收集相同的信息:

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

    这可能是特定于GNU的!

    这可能适合您:

    sed '/Package:/!d;N;s/^[^ ]* //mg;y/\n/\t/' filename
    nimbox-apexer-sales     1.0.0-201007241449
    nimbox-tomcat   6.0.26-5
    
    另外,如果您注意到可以从
    文件名:
    行收集相同的信息:

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

    这可能是GNU-sed-specific!

    也可以很好地工作。必须只为
    grep-dctrl
    查找给出@rafl的答案。也可以很好地工作。必须只为
    grep-dctrl
    查找给出@rafl的答案。实际上解决了
    grep-dctrl-n-s包,版本为nimbox包| paste-s-d“\t\n”
    实际上已经解决了
    grep dctrl-n-s软件包,版本为nimbox软件包| paste-s-d“\t\n”
    工作得很好。将更改我为sed命令最后一部分使用的粘贴命令。谢谢!!!工作得很好。将更改我为sed命令最后一部分使用的粘贴命令。谢谢!!!