是否有可能让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}' *
答案 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