Bash Shell显示匹配短语之后的文本

Bash Shell显示匹配短语之后的文本,你要在文档中搜索某个短语,并希望找到该短语后还能显示之后的文本段落。

解决方案

假设在一个简单的文本文件中,段落就是空行之间的所有文本,因此空行的出现就意味着段落的结束。有鉴于此,我们来看看下面这个短小精悍的 awk 脚本。

$ cat para.awk
/keyphrase/ { flag=1 }
flag == 1 { print }
/^$/ { flag=0 }

$ awk -f para.awk < searchthis.txt

讨论

这里只有 3 个简单的代码块。当输入行匹配正则表达式(这里是单词“keyphrase”)时,调用第一个代码块。只要“keyphrase”出现在输入行内的任何位置,就算匹配,然后执行该代码块。第一个代码块只干一件事:设置标志变量。

对于所有的输入行,第二个代码块都会被调用,因为其左花括号之前没有正则表达式。即便是匹配“keyphrase”的输入行,也会调用该代码块(如果不想这样,可以在第一个代码块中使用 next 语句)。第二个代码块所做的是:仅当标志变量设置时,打印整个输入行。

第三个代码块有对应的正则表达式,如果匹配,则重置(关闭)标志变量。这里的正则表达式使用了两个带有特殊含义的字符:脱字符(^),如果用作正则表达式的第一个字符,就匹配行首位置;美元符号($),如果用作正则表达式的最后一个字符,就匹配行尾位置。因此,正则表达式 ^$ 匹配的是一个空行,行首和行尾之间没有任何字符。

我们可以对空行使用一个稍微复杂的正则表达式,使其也能够处理只包含空白字符的行,而不只是彻头彻尾的空行。修改后的第 3 行代码如下所示:

/^[[:blank:]]*$/ { flag=0 }

Perl 程序员会喜欢本文中讨论的这种问题和解决方案,但我们是用 awk 搞定的,因为 Perl(差不多)超出了本文的讨论范围。如果了解 Perl,那么不用犹豫,你可以直接使用。如果不了解,那就全靠 awk 了。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!