我有一个文字,我想要打印文本中只显示第一个出现的2个单词之间的内容,如果存在则禁用贪婪,例如假设我有这个文本
word1 XXXX
TTTT
YYYY
ZZZZ
GGGG word2 JJJJJJJ word2
ads
word2
adasdas
word1
asadadsasd
word2
我想要的是
XXXX
TTTT
YYYY
ZZZZ
GGGG
谢谢
答案 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
匹配才一直用到它。它很棘手,但它的工作原理。