Grep:比赛前后的最大单词

时间:2012-01-24 06:11:32

标签: grep

是否有可能让grep在比赛前后显示最多的单词? 例如,给定行

aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm nnn ooo ppp qqq rrr sss

我想grep不要返回整条线,但只比赛前后的3个单词。例如,搜索'iii',结果将是

fff ggg hhh iii jjj kkk lll

我试过了,但没有返回结果:

grep -o '\w{0, 20}MY_SEARCH\w{0, 20}' *

3 个答案:

答案 0 :(得分:2)

string='aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm nnn ooo ppp qqq rrr sss'

echo $string | grep -oP '(([a-zA-Z]+) ){0,3}iii( ([a-zA-Z]+)){0,3}'

如果我理解你的问题,那么当双方的最大字数为3时,应该这样做。

答案 1 :(得分:0)

我尝试将空格转换为换行符,然后使用-A和-B选项,然后将\ n重新转换为空格。

$ echo "aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm nnn ooo ppp qqq rrr sss" | tr ' ' '\n' | grep -A3 -B3 "iii" | tr '\n' ' '

OP => fff ggg hhh iii jjj kkk lll

我知道这是一种原始方法,但需要检查是否存在任何其他更好的选择。

我用这个逻辑编写了一个小shell脚本来处理多个文件。检查一下

#!/bin/bash

for i in `find . -name "*.txt"`
do
    FNAME=$i
    MATCHED=""
    if grep "iii" $i > /dev/null 2>&1
    then
        MATCHED=`cat $i | tr ' ' '\n' | grep -A3 -B3 "iii" | tr '\n' ' '`
    fi

    if [ "$MATCHED" != "" ]
    then
        echo "$FNAME|$MATCHED"
    fi
done    

答案 2 :(得分:0)

grep -E -o '.{0, 3}iii.{0, 3}'

它将输出此

hhh iii jjj

如果你想删除'iii',你也可以管道sed

grep -E -o '.{0,3}iii.{0,3}' | sed 's/iii//g'

它将输出此

hhh jjj