使用bash从文本文件中的4个标记之间提取文本

使用bash从文本文件中的4个标记之间提取文本,bash,sed,awk,Bash,Sed,Awk,好的,这里有一个棘手的问题。。。我有一个file1,我想用file1中的特定文本创建一个file2 random useless text #START random IMPORTANT text #END random useless text random useless text #START random IMPORTANT text #END random useless te

好的,这里有一个棘手的问题。。。我有一个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(包括#的)之间的文本,但忽略第二对#START和#END。请注意,在同一个文件中,开始和结束对出现了两次。我只想要第一对之间的东西(包括#的符号)

说了这么多,做了这么多之后,我应该只得到这个字面上的结果(仅从第一对#开始#结束:

     #START
     random IMPORTANT text
     #END

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

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

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

但当我在这个sed中使用“#开始”和“#结束”时,它保留了两对#开始和#结束

注意:第一对“开始”和第二对“结束”之间的内容总是不同的。

我会使用awk:

awk'/#开始/{flag=1}标志{print}/#结束/{exit}您的_文件

说明:

  • 当前记录与包含起始标记的正则表达式匹配时设置标志
  • 设置标志后,将打印当前记录
  • 当记录匹配结束标记时,程序就存在了,所以第二个副本就不会被处理
  • 注意:一个记录可以应用多个awk规则。 另请注意:根据您的任务,您可能需要调整记录分隔符
    RS
    和输出记录分隔符
    ORS
    ,例如:

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

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

    blahblahblah #START
    important text
    #END blah blah blah
    fdsfs
    
    如有需要,请参阅官方参考手册,以获取
    gawk

    我将使用awk:

    awk'/#开始/{flag=1}标志{print}/#结束/{exit}您的_文件

    说明:

  • 当前记录与包含起始标记的正则表达式匹配时设置标志
  • 设置标志后,将打印当前记录
  • 当记录匹配结束标记时,程序就存在了,所以第二个副本就不会被处理
  • 注意:一个记录可以应用多个awk规则。 另请注意:根据您的任务,您可能需要调整记录分隔符
    RS
    和输出记录分隔符
    ORS
    ,例如:

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

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

    blahblahblah #START
    important text
    #END blah blah blah
    fdsfs
    
    如有需要,请参阅官方参考手册,了解《gawk》:

    这可能适合您(GNU-sed):

    说明:

    • /#START/,/#END/!d
      删除(不要打印)任何不在
      #START
      #END
      之间的内容。这将只在
      #START
      #END
      之间打印
    • /#END/q
      退出,但遇到
      #END
    这可能适合您(GNU-sed):

    说明:

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

    什么是代币?它们是如何分开的?什么是代币?它们是如何分开的?