我有一个文本,我想打印该文本中 2 个单词之间的任何内容,仅显示第一次出现并禁用贪婪(如果存在),例如假设我有这个文本
word1 XXXX
TTTT
YYYY
ZZZZ
GGGG word2 JJJJJJJ word2
ads
word2
adasdas
word1
asadadsasd
word2
我想要的是
XXXX
TTTT
YYYY
ZZZZ
GGGG
谢谢
我会选择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
所以我在这里有一点技巧。但它有效。
测试文件:
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
匹配。它很棘手,但它有效。