【问题标题】:How to use grep,awk or sed to extract text between two strings?如何使用 grep、awk 或 sed 提取两个字符串之间的文本?
【发布时间】:2017-02-01 03:28:15
【问题描述】:

请帮助我使用 SED、AWK 或 GREP 来提取以下文本。我有类似的文件。

Text text text text text text text
Text text text text text text text
   Table A
<TABLE>
xxx xxx xxx xxx
xxx xxx xxx xxx
</TABLE>
Text text text text text text text
Text text text text text text text
   Table B
<TABLE>
xxx xxx xxx xxx
xxx xxx xxx xxx
</TABLE>

我只需要表 A 的所有信息,但不知道该怎么做。

【问题讨论】:

  • Table A的区别部分是什么,实际内容是什么?
  • 用实际的、真正具有代表性的示例文本替换所有文本、文本、文本占位符。添加给定输入的预期输出。

标签: awk sed grep


【解决方案1】:

其中任何一个都可能是您想要的,具体取决于您的预期输出和其余文本的外观:

$ awk '/Table A/{f=1} f{print; if (/<\/TABLE>/) exit}' file
   Table A
<TABLE>
xxx xxx xxx xxx
xxx xxx xxx xxx
</TABLE>

$ awk 'f{print; if (/<\/TABLE>/) exit} /Table A/{f=1}' file
<TABLE>
xxx xxx xxx xxx
xxx xxx xxx xxx
</TABLE>

【讨论】:

    【解决方案2】:

    只要 TABLE 元素内没有 。

    sed -n '/Table A/,/<\/TABLE>/p' | grep -v "Table A" 
    

    PS: grep -v 可能不是必需的,我只是不知道不包括起始模式的选项。

    打印出来

     <TABLE>
      xxx xxx xxx xxx
      xxx xxx xxx xxx
     </TABLE>
    

    如果您需要文本部分,这将不起作用。 AWK 可能会更好。

    如果你需要一些带有变量名的东西,你可以这样做

     myTableName="Table A"
     sed -n "/${myTableName}/,/<\/TABLE>/p" | grep -v ${myTableName}
    

    【讨论】:

    • 不要那样做。范围使琐碎的任务变得非常简单,但随后需要重复的条件(如上所示)或考虑到最小的需求变化而完全重写。只需使用标志而不是范围(这意味着您应该使用 awk,而不是 sed 和/或 grep)。
    【解决方案3】:

    你甚至可以 grep 这样做,但 awk 似乎更好。

    grep -A1000 "Table A" file.txt | grep -B1000 "Table B"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 2014-10-03
      • 2018-01-19
      • 2013-05-14
      • 1970-01-01
      • 2021-07-18
      相关资源
      最近更新 更多