【问题标题】:Extract text from between 4 tokens in a text file using bash使用 bash 从文本文件中的 4 个标记之间提取文本
【发布时间】:2012-08-11 15:34:16
【问题描述】:

好的,这是一个棘手的问题...我有一个文件 1,我想创建一个文件 2,其中只包含文件 1 中的特定文本。

     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 之间的内容不同。

【问题讨论】:

  • 什么是令牌?它们是如何分开的?

标签: bash sed awk


【解决方案1】:

我会使用 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 的官方参考手册:link

【讨论】:

    【解决方案2】:

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

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

    解释:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多