如何使用bash和操作输出

时间:2016-11-21 22:38:27

标签: bash shell unix sed scripting

我有一个大文本文件,其中包含两个令牌之间的文本块,我想要提取并放入一个新文件中。我希望每个块被提取为单行(每个块都有自己的行)。

我使用了这个解决方案: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

2 个答案:

答案 0 :(得分:0)

我能够通过单独运行来实现这一目标:

library(scales)
graph<-ggplot(df, aes(x=DATE, y= Revenue, fill = DATE)) + geom_bar(stat = "identity") +labs(x = "Date", y= "Revenue") + scale_x_date(labels = date_format("%m-%d"))+facet_wrap(~`TYPE2`+`TYPE3`)

ggplotly(graph)
第一个解决方案后

在我的文件上

答案 1 :(得分:0)

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

ssh hostname 'for pid in $(ps -ef | grep "some process" | awk '{print $2}'); do kill -9 $pid; done'