sed从比赛1到比赛2

时间:2012-08-24 18:32:50

标签: regex sed grep

我有一个文字,我想要打印文本中只显示第一个出现的2个单词之间的内容,如果存在则禁用贪婪,例如假设我有这个文本

    word1 XXXX
TTTT
YYYY
ZZZZ
    GGGG word2 JJJJJJJ word2
    ads
    word2
    adasdas
    word1
    asadadsasd
    word2

我想要的是

    XXXX
TTTT
YYYY
ZZZZ
    GGGG

谢谢

2 个答案:

答案 0 :(得分:1)

我会为这份工作选择perl

假设infile包含问题的内容以及script.pl的以下内容:

#!/usr/bin/env perl
use warnings;
use strict;

die qq|Usage: perl $0 <input-file> <word-1> <word-2>\n| unless @ARGV == 3;

my ($word2, $word1) = (pop, pop);

while ( <> ) { 

    ## Remove last '\n'.
    chomp;

    ## Match range between first appearance of 'word1' and first appearance
    ## of 'word2'.
    if ( ( my $w1 = m/\Q$word1/ ) ... ( my $w2 = m/\Q$word2/ ) ) { 

        ## When 'word1' matched remove all characters but spaces until it.
        if ( $w1 ) { 
            s/\A(\s*).*?\Q$word1/$1/;
        }   

        ## When 'word2' matched remove all characters after it.
        if ( $w2 ) { 
            s/\A(.*?)\Q$word2\E.*$/$1/;
            printf qq|%s\n|, $_; 
            exit 0;
        }   

        ## Print lines inside the range.
        printf qq|%s\n|, $_; 
    }   
}

像以下一样运行:

perl script.pl infile word1 word2

使用以下输出:

     XXXX
TTTT
YYYY
ZZZZ
    GGGG

答案 1 :(得分:1)

所以我在这里有一点黑客攻击。但它的确有效。

测试文件:

jfkakfakjskfj
    **word1** XXXX
TTTT
YYYY
ZZZZ
    GGGG **word2**
    ads
    **word2**
    adasdas
    **word1**
    asadadsasd
    **word2**

输出:

    **word1** XXXX
TTTT
YYYY
ZZZZ
    GGGG **word2**

Sed命令:

sed -n '/word1/,$p' file | sed -n '1,/word2/p'

第一个sed命令匹配从word1一直到文件末尾的所有行,然后我们将它传输到第二个sed命令,该命令匹配文件开头的所有行(我们直到word2匹配才一直用到它。它很棘手,但它的工作原理。