使用bash在文本文件中提取4个标记之间的文本
好吧,这里有一个棘手的问题......我有一个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之间的内容不同。
我会用awk:
awk '/#START/{flag=1} flag{print} /#END/{exit}' your_file
说明:
- 在当前记录包含开始标记的正则表达式匹配设置标志。
- 当标志被置位,当前记录被印刷
- 当记录匹配结束令牌,程序只是存在,从而第二拷贝不被处理
注:多个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
这可能会为你工作(GNU SED):
sed '/#START/,/#END/!d;/#END/q' file
说明:
-
/#START/,/#END/!d
删除(不要打印)任何不在#START
和#END
之间的内容。这将只打印#START
和#END
/#END/q
之间 - 退出,但是当你遇到
#END
什么是令牌仍然打印?他们是如何分开的? – 2012-08-11 01:57:31