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

use*_*741 10 awk sed line

需要帮助扫描文本文件并找到两种模式之间的所有单词.就像说如果我们有.sql文件,需要扫描并找到'和'之间的所有单词'.Grep一次只能扫描1行.对于此要求,最好使用的unix脚本是什么?sed,awk有这些功能吗?非常感谢指出任何例子.

Jan*_*lho 22

Sed有这个:

sed -n -e '/from/,/where/ p' file.sql
Run Code Online (Sandbox Code Playgroud)

打印带有a from的行和带有a 的行之间的所有行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
}
Run Code Online (Sandbox Code Playgroud)

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

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

from找到包含的行时,第二个命令开始执行一系列命令(按括号分组).基本上,命令形成一个循环,该循环将保持从输入到模式空间的附加行,直到where找到具有a的行或直到我们到达最后一行.

:"命令"创建一个标签,在使我们能够"跳"回来时,我们要脚本标记.该N命令从输入中读取一行,并将其附加到模式空间(用换行符分隔行).

where找到a时,我们可以打印出模式空间的内容,但首先我们必须用substitute命令清理它.它类似于以前用过的一个,但我们现在更换开头和结尾.*[^\n]*,它告诉sed只匹配非换行符,有效地从第一行和最后一行,其中匹配.d然后该命令清除模式空间并在下一行重新启动脚本.

b命令将跳转到标签,在我们的例子中是标签next.但是,$!地址表示它不应该在最后一行执行,允许我们离开循环.当以这种方式离开循环时,我们没有找到相应的where,所以你可能不想打印它.

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

from ... where ... from

from ... from
where

from
where ... where

from
from
where
where
Run Code Online (Sandbox Code Playgroud)

处理这些情况需要更多代码.

希望这有助于=)