使用bash在文本文件中提取2个标记之间的行

tap*_*pan 20 bash

我有一个文本文件,如下所示:

random useless text 
<!-- this is token 1 --> 
para1 
para2 
para3 
<!-- this is token 2 --> 
random useless text again
Run Code Online (Sandbox Code Playgroud)

我想在令牌之间提取文本(当然不包括令牌).我尝试使用##和%%来提取数据,但它不起作用.我认为它不适用于操纵如此大的文本文件.有什么建议我怎么做?也许awk或sed?

Pau*_*ce. 39

不需要headtail/ grep或多次读取文件:

sed -n '/<!-- this is token 1 -->/{:a;n;/<!-- this is token 2 -->/b;p;ba}' inputfile
Run Code Online (Sandbox Code Playgroud)

说明:

  • -n - 不要做隐式打印
  • /<!-- this is token 1 -->/{ - 如果找到起始标记,那么
    • :a - 标签"a"
      • n - 阅读下一行
      • /<!-- this is token 2 -->/q - 如果它是结束标记,则退出
      • p - 否则,打印线
    • ba - 分支标签"a"
  • } 万一


Pet*_*lor 25

你可以提取它,包括带有sed的标记.然后用头部和尾部剥去令牌.

... | sed -n "/this is token 1/,/this is token 2/p" | head -n-1 | tail -n+2