Bash 使用sed组合两个特定行
我有以下输入文件,您可能会将其识别为debianBash 使用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
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/ /'
其中:
假设您的文件名为test.txt:
grep -P '^Package: |^Version:' test.txt | awk '{ print $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命令最后一部分使用的粘贴命令。谢谢!!!