Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
Sed 如何在unix中提取多行文字?_Sed_Awk_Pattern Matching_Design Patterns - Fatal编程技术网

Sed 如何在unix中提取多行文字?

Sed 如何在unix中提取多行文字?,sed,awk,pattern-matching,design-patterns,Sed,Awk,Pattern Matching,Design Patterns,我想从以下字符串中提取一些特定单词:- Exported Layer : missing_hello Comment : Total Polygons : 20000 (reported 100). 我想从上面的字符串中提取单词missing_hello和2000,并将其显示为 missing_hello : 20000 如何在unix中执行此操作?在awk中: 如果输入是垃圾,那么输出将太多。如果字段可以包含冒号,生活就会变得更混乱 在sed中: 此sed版本中字段中的冒号没

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

Exported Layer : missing_hello  
Comment :   
Total Polygons : 20000 (reported 100).  
我想从上面的字符串中提取单词missing_hello和2000,并将其显示为

missing_hello : 20000
如何在unix中执行此操作?

在awk中:

如果输入是垃圾,那么输出将太多。如果字段可以包含冒号,生活就会变得更混乱

在sed中:

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

现在已在MacOS X 10.6.7上测试。两个脚本都在“总多边形数”行中的数字后面包含注释。两个脚本都可以很容易地修改为只打印数字而忽略注释。这将有助于对所有可能的格式有一个精确的定义

我可能会使用Perl或Python来完成这项工作;字段拆分非常混乱,可以从这些语言中更好的功能中获益。

在awk中:

如果输入是垃圾,那么输出将太多。如果字段可以包含冒号,生活就会变得更混乱

在sed中:

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

现在已在MacOS X 10.6.7上测试。两个脚本都在“总多边形数”行中的数字后面包含注释。两个脚本都可以很容易地修改为只打印数字而忽略注释。这将有助于对所有可能的格式有一个精确的定义


我可能会使用Perl或Python来完成这项工作;字段拆分非常混乱,可以从这些语言中更好的功能中获益。

请参阅本指南-


Sed当然是一个值得学习的工具。我将特别看一下标题为“使用\1保留部分模式”和“使用多行”的章节。

看一下本指南-


Sed当然是一个值得学习的工具。我将特别关注标题为“使用\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;
    }
}

如果您有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;
    }
}

假设每次只缺一个字,你就可以:

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

假设每次只缺一个字,你就可以:

perl -lane '$el=$F[3] if(/Exported Layer/); print "$el: $F[3]" if(/Total Polygons/);'
我搞错了。我没有读undef行…我会删除我的主要评论。我搞错了。我没有读undef行…我将删除我的主要评论。