0

最初の出現のみを表示し、存在する場合は貪欲を無効にする、そのテキストの2つの単語の間にあるものを印刷したいというテキストがあります。たとえば、このテキストがあるとしましょう

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

私が欲しいのは

    XXXX
TTTT
YYYY
ZZZZ
    GGGG

ありがとう

4

2 に答える 2

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は、ファイルの最後まですべての行に一致し、次に、ファイルの最初から(パイプしたばかりの)すべての行に一致する2番目のsedコマンドにパイプします。word2一致するまで。そのトリッキーですが、それは動作します。

于 2012-08-24T19:16:38.683 に答える
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
于 2012-08-24T19:05:32.597 に答える