如何在unix中提取多行单词?

时间:2011-06-14 19:31:28

标签: sed awk pattern-matching design-patterns

我想从以下字符串中提取一些特定的单词: -

Exported Layer : missing_hello  
Comment :   
Total Polygons : 20000 (reported 100).  

我想从上面的字符串中提取“missing_hello”和“2000”这个词,并希望将其显示为

missing_hello : 20000

如何在unix中执行此操作?

4 个答案:

答案 0 :(得分:1)

awk

awk -F: '/Exported Layer/ { export_layer = $2 }
         /Total Polygons/ { printf("%s : %s\n", export_layer, $2); }' "$@"

如果输入是垃圾,输出也是(GIGO)。如果这些字段可以包含冒号,那么生活就会变得更加混乱。

sed

sed -n -e '/Exported Layer : *\(.*\)/{s//\1 : /;h;}' \
       -e '/Total Polygons : *\(.*\)/{s//\1/;x;G;s/\n//;p;}' "$@"

字段中的冒号对此sed版本没有问题。

现在在MacOS X 10.6.7上测试。这两个脚本都包含“Total Polygons”行中数字后的注释。这两个脚本都可以很容易地修改为仅打印数字而忽略评论。有助于准确定义所有格式的可能性。

我可能实际上使用Perl(或Python)来完成这项工作;现场分裂只是凌乱,足以从这些语言中更好的设施中受益。

答案 1 :(得分:1)

请查看本指南 - http://www.grymoire.com/Unix/Sed.html

Sed肯定是值得学习的工具。我会特别注意标题为“使用\ 1保留模式的一部分”和“使用多行”的部分。

答案 2 :(得分:1)

如果你有perl,你可以使用它:

use strict;
use warnings;

my $layer;
my $polys;

while (<>) {
    if ($_ =~ m{^Exported \s Layer \s : \s (\S+)}xms) {
        $layer = $1;
        next;
    }
    if ($_ =~ m{^Total \s Polygons \s : \s (\d+)}xms) {
        $polys = $1;
    }
    if (defined $layer && defined $polys) {
        print "$layer : $polys\n";
        $layer = $polys = undef;
    }
}

答案 3 :(得分:1)

假设miss_hello每次都是一个单词 - 你可以:

perl -lane '$el=$F[3] if(/Exported Layer/); print "$el: $F[3]" if(/Total Polygons/);'