gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:46:08 27 4
gpt4 key购买 nike

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

最佳答案

Sed 有这个:

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

打印带有 from 的行之间的所有行和一 strip 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 脚本)稍微复杂一些,我会尽量解释细节。

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

当一行包含 from 时,第二个命令开始执行一系列命令(按大括号分组)被发现。基本上,这些命令形成了一个循环,该循环将继续从输入到模式空间中添加行,直到一行带有 where找到或直到我们到达最后一行。
: “命令”创建了一个标签,脚本中的一个标记,允许我们在需要时“跳”回。 N命令从输入中读取一行,并将其附加到模式空间(用换行符分隔行)。

where找到后,我们可以打印出模式空间的内容,但首先我们必须使用替换命令清理它。它与之前使用的类似,但我们现在替换前导和尾随 .*[^\n]* ,它告诉 sed 只匹配非换行符,有效地匹配第一行中的 from 和最后一行中的 where。 d命令然后清除模式空间并在下一行重新启动脚本。
b命令将跳转到一个标签,在我们的例子中是标签 next .然而, $! address 说它不应该在最后一行执行,允许我们离开循环。当以这种方式离开循环时,我们还没有找到相应的 where ,因此您可能不想打印它。

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

from ... from
where

from
where ... where

from
from
where
where

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

希望这会有所帮助 =)

关于awk - Grep 访问多行,查找两个模式之间的所有单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12918292/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com