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

我会选择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 回答
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匹配。它很棘手,但它有效。

于 2012-08-24T19:16:38.683 回答