2016-11-21 26 views
0

我有一个大文本文件,两个令牌之间有文本块,我想提取并放入一个新文件。我想要提取的每个块单行(每个块都有自己的行)。如何使用bash提取文本文件中的令牌和操作输出

我用这个解决方案:Extract lines between 2 tokens in a text file using bash

sed -n '/<!-- this is token 1 -->/{:a;n;/<!-- this is token 2 -->/b;p;ba}' inputfile 

和它的工作近乎完美。我遇到的问题是提取的块是两行,我想将它浓缩为一行。我怎样才能做到这一点?

例子:

<token1> 
text to 
extract 
<token2> 
<token1> 
text to 
extract 
<token2> 

输出应该是这样的:

text to extract 
text to extract 
+0

类似溶液可以使用'AWK -v RS =“<如果你的标记真的像你提到的那样,那么token [[:digit:]]>“'{$ 1 = $ 1} /./{print $ 0}'inputfile'。 –

回答

0

我能做到这一点通过单独运行:

sed -e '/pattern/N;y/\n/\t/' 

在我的文件中的第一个解决方案

0

awk更适合于这种文本处理的比sed

$ cat ip.txt 
<token1> 
text to 
foo 
extract 
<token2> 
<token1> 
text to 
extract 
123 
bar foo 
baz 
<token2> 

$ awk '/<token1>/{f=1; next} /<token2>/{print a; a=""; f=0} f{a = a ? a" "$0 : $0}' ip.txt 
text to foo extract 
text to extract 123 bar foo baz 


perl

$ perl -lne 'if(/<token1>/){$f=1; next} if(/<token2>/){print "@a"; undef @a; $f=0}; push(@a,$_) if $f' ip.txt 
text to foo extract 
text to extract 123 bar foo baz 

$ perl -lne 'if(/<token1>/){$f=1; next} if(/<token2>/){print $a; $a=""; $f=0}; $a .= $a?" $_":$_ if $f' ip.txt 
text to foo extract 
text to extract 123 bar foo baz 
相关问题