1

好的,这是一个棘手的问题……我有一个 file1,我想用 file1 中的特定文本创建一个 file2。

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

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

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

一切都说完了,我应该只有这个字面结果(仅来自第一对#START #END:

     #START
     random IMPORTANT text
     #END

在另一篇文章中有人使用:

sed -n "/这是令牌 1/,/这是令牌 2/p"

这是一种删除单个配对字符串“this is a token 1”和“this is a token 2”的方法

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

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

4

2 回答 2

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}'

这会将记录分隔符设置为任意数量的空白字符,并将输出记录分隔符设置为空格。因此,标记由空格分隔,并且任何可能的信息都不会进入输出。在这样的输入上比较,例如第一个版本与这个版本:

blahblahblah #START
important text
#END blah blah blah
fdsfs

gawk如果需要,请参阅官方参考手册:链接

于 2012-08-11T02:01:56.763 回答
2

这可能对您有用(GNU sed):

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

解释:

  • /#START/,/#END/!d删除(不打印)不在 和 之间的任何#START内容#END。这只会在#START和之间打印#END
  • /#END/q遇到时退出但仍然打印#END
于 2012-08-11T07:34:16.950 回答