2012-08-11 73 views
1

好吧,这里有一个棘手的问题......我有一个file1,我想用file1中的特定文本创建file2。使用bash在文本文件中提取4个标记之间的文本

 random useless text 
    #START 
    random IMPORTANT text 
    #END 
    random useless text 

    random useless text 
    #START 
    random IMPORTANT text 
    #END 
    random useless text 

我想提取在所述第一对和#START的#END(包括#的)之间的文本,但忽略第二对#START和#END的。请注意,#START #END对在同一个文件中出现两次。我只想要第一对(包括#的符号)之间的内容。

这一切都说过和做过之后,我只有这个文字结果(从第一只对#START #END的:

 #START 
    random IMPORTANT text 
    #END 

在另一个岗位有人使用:

sed -n“/这是标记1 /,/这是标记2/p”

这是一种删除单个配对字符串“这是一个标记1”和“这是一个标记2”

但是,当我在此sed中使用“#START”和“#END”时,它会保留#START和#END这两对。

注意:第一个#START #END之间的内容总是与第二对#START #END之间的内容不同。

+0

什么是令牌仍然打印?他们是如何分开的? – 2012-08-11 01:57:31

回答

5

我会用awk:

awk '/#START/{flag=1} flag{print} /#END/{exit}' your_file

说明:

  1. 在当前记录包含开始标记的正则表达式匹配设置标志。
  2. 当标志被置位,当前记录被印刷
  3. 当记录匹配结束令牌,程序只是存在,从而第二拷贝不被处理

:多个AWK规则可应用于一记录。 还要注意:这取决于你的任务,你可能需要调整记录分隔RS和输出记录分隔ORS,例如:

gawk -v RS='[[:space:]]+' -v ORS=' ' '/#START/{flag=1} flag{print} /#END/{exit}'

这台记录分隔符来的空白字符的任意号码,并输出将分隔符记录到空间。因此,令牌由空格隔开,并且不会有exta可能的信息进入输出。比较,例如第一个版本VS这个版本上,例如输入:

blahblahblah #START 
important text 
#END blah blah blah 
fdsfs 

gawk查阅官方参考手册,如果需要的话:link

2

这可能会为你工作(GNU SED):

sed '/#START/,/#END/!d;/#END/q' file 

说明:

  • /#START/,/#END/!d删除(不要打印)任何不在#START#END之间的内容。这将只打印#START#END/#END/q之间
  • 退出,但是当你遇到#END
相关问题