当前位置: 首页 > 知识库问答 >
问题:

Grep访问多行,查找两个模式之间的所有单词

燕意蕴
2023-03-14

需要帮助扫描文本文件,找到两个模式之间的所有文字。比如,如果我们有一个。sql文件,需要扫描并找到from和where之间的所有单词。Grep一次只能扫描一行。对于这个需求,最好的unix脚本是什么?sed,awk有这些特性吗?指出任何例子都是非常感谢的。

共有1个答案

澹台博文
2023-03-14

Sed有以下内容:

sed -n -e '/from/,/where/ p' file.sql

打印带有from的行和带有where的行之间的所有行。

对于可以包括同时具有from和where的行的内容:

#!/bin/sed -nf

/from.*where/ {
    s/.*\(from.*where\).*/\1/p
    d
}
/from/ {
    : next
    N
    /where/ {
        s/^[^\n]*\(from.*where\)[^\n]*/\1/p
        d
    }
    $! b next
}

这(作为sed脚本编写)稍微复杂一些,我将尝试解释细节。

第一行在同时包含fromwhere的行上执行。如果一行匹配该模式,则执行两个命令。我们使用ssubstitute命令只提取from和where之间的部分(包括from和where)。该命令中的p后缀将打印该行。delete命令清除模式空间(工作缓冲区),加载下一行并重新启动脚本。

当找到包含from的行时,第二个命令开始执行一系列命令(按大括号分组)。基本上,这些命令形成了一个循环,它将不断地从输入向模式空间追加行,直到找到带有的行,或者直到我们到达最后一行。

当在中找到时,我们可以打印模式空间的内容,但首先我们必须使用substitute命令清除它。它与前面使用的类似,但是我们现在将前导和尾随的.*替换为[^\n]*,这告诉sed只匹配非换行字符,有效地匹配第一行中的from和最后一行中的where。然后,d命令清除模式空间,并在下一行重新启动脚本

b命令将跳转到一个标签,在本例中是标签next。但是,$!地址表示它不应该在最后一行执行,从而允许我们离开循环。当以这种方式离开循环时,我们没有找到相应的中的位置,因此您可能不想打印它。

但是请注意,这也有一些缺点。以下情况将不按预期处理:

from ... where ... from

from ... from
where

from
where ... where

from
from
where
where
 类似资料:
  • 我们希望您能够帮助我们解决以下问题: 给出了一个可能包含圈的有向图。必须找到一组满足以下标准的路径: 在从节点A到节点B的过程中可以通过的所有边必须被集合内的路径覆盖(一条边可以是集合中多条路径的一部分) 解决方案不必是路径数最少的解决方案,路径也不必是最短的。然而,该解决方案应该可以像java一样使用编程语言高效地实现。我们需要解决方案来生成几个测试用例,覆盖节点a和节点B之间的所有边很重要。

  • 我必须用下面的长字符串。如何提取介于“url=”和“,”之间的所有值,以便获得以下数组? 我尝试了以下方法,但它只给我第一次出现,但我需要它们。谢谢!

  • 这里的练习是:我需要编写一个递归方法,它可以得到N*N大小的正整数矩阵,起始单元格行和列索引以及结束单元格行和列索引,并且该方法需要返回从起始单元格到结束单元格的可能路径数,这些约束条件是:a.你可以从当前位置移动到左单元格、右单元格、上单元格或下单元格。b.你不能越过主对角线,但是你可以转到对角线上的单元格(但不能越过它)。路由中的每个单元格只出现一次。d.矩阵需要像原始矩阵一样,末尾有原始单元

  • 问题内容: 在中,我想找到标记以及两者之间的所有内容,如下所示: 我想找到标记以及之间的所有内容,然后将其删除。 标签之间的所有内容都是变量,但是我想在获得时删除整个标签和子标签。 有人知道该怎么做吗? 问题答案: 使用正则表达式进行HTML / XML解析不是一个好主意… 但是,如果仍然要执行此操作,请搜索正则表达式模式 并将其替换为空字符串…

  • 我正在使用DocX库来替换word文档中的文本。我想以某种方式找到模板docx文件中“[]”之间的所有字符串,例如[Name]、[LastName]、[Date]等...并将其替换为我以前加载到datagridview中具有相同列名(name、LastName、Date)的值。以下是我目前掌握的信息:

  • 问题内容: 如何使用PHP查找两个日期之间的天数? 问题答案: