unix:如果两个模式之间存在字符串,则搜索文件

时间:2014-09-21 12:51:23

标签: regex unix awk sed grep

我有一个文件,格式如下。我想搜索一个单词,例如'你好'存在于下一个模式和DocName之前。如果它存在,有多少这样的架构有它? 如何使用grep / awk / sed在一行中完成此操作?

预期的输出是:假设我正在搜索word' hello'存在,然后在这种情况下,它出现在第一,第二和第四模式中,因此输出为3,因为我们有三个'你好''以三种模式呈现。请注意,即使有多次出现'hello'在第一个模式中,它仍被视为一个。

:
:
:
DocName: abjrkj.txt
schema:
abs
askj
djsk
djsk
hello
adj
hello

DocName: abjrkj.txt
schema:
abs
askj
djsk
djsk
adj
hello

DocName: aasjrkj.txt
schema:
absasd
askjas
djsksa
djskasd
adjsg

DocName: ghhd.txt
schema:
absg
fdgaskj
dgdjsk
dgdfdjsk
drgadj
hello
:
:
:

3 个答案:

答案 0 :(得分:0)

试试这个。

awk -F '^DocName:' '/hello/ { ++i }
    END { print i }' file

如果你绝对需要单行解决方案(为什么??),空格可以缩小到一个空格。

答案 1 :(得分:0)

这是sed解决方案:

sed ':a; N; s/\n/ /; $!ba; s/DocName/\n&/g' < file | sed -n '/DocName/{/hello/p}' | wc

这是算法:它将整个文件放在模式空间中,用空格替换所有\ n个字符。然后在每个DocName字符串之前放置\ n。之后是管道搜索Docname&amp;你好最后打印3个号码,首先要求它们。如果你想看到打印的行省略| wc管道用于测试原因。也许更优雅的sed解决方案存在与模式&amp;抱着空间!

答案 2 :(得分:0)

由于您的输入文件的模式由空行分隔,您可以在段落模式下使用awk然后它只是:

$ awk -v RS= '/hello/{++c} END{print c}' file
3
相关问题