2016-11-21 25 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 
相關問題