Regex 使用awk打印匹配单词前后的“x”字

Regex 使用awk打印匹配单词前后的“x”字,regex,awk,Regex,Awk,我正在文本文件中搜索特定单词。下面的命令将返回该文本文件中的每个引用 awk '/text_to_be_searched/ { match($0, /text_to_be_searched/); print ( NR-1"-----"$0) ;}' filename.txt 但是现在我必须只显示第一次出现的匹配单词前后的“x”个单词 您可以改用grep grep -Eo -m 1 '.{x}pattern.{y}' pattern files x是模式之前要匹配的字数 y是模式后要匹配的单

我正在文本文件中搜索特定单词。下面的命令将返回该文本文件中的每个引用

awk '/text_to_be_searched/ { match($0, /text_to_be_searched/); print ( NR-1"-----"$0) ;}' filename.txt 

但是现在我必须只显示第一次出现的匹配单词前后的“x”个单词

您可以改用grep

grep -Eo -m 1 '.{x}pattern.{y}' pattern files
x是模式之前要匹配的字数

y是模式后要匹配的单词数

-m1表示返回第一个匹配

注意:模式中的任何正则表达式特殊字符都应该转义,否则将被解释为正则表达式

awk -v word="your word here" '{
     for(i=1;i<=NF;i++) 
        if(match($i,word)) 
         {m=i; break}
     } 
     m {
       for(i=m-3;i<=m+3;i++) 
          if(i>0 && i<=NF) print $i; 
       exit
     }'

将在第一次匹配之前和之后打印3个单词(如果有)。这个跨度的上下文是一条线。如果您想扩展到完整的段落,请添加-vRS=

谢谢@Anirudha。是不是x是行数。我不需要任何语言。我尝试过你的解决方案,但它偏离了实际结果。例如,我在文件中有一个名为“test”的单词,它位于文件的第一行,而该行中没有其他单词。此时,如果命令有50个字的值,则它正在搜索下一行,该行具有50个字的模式。@Anish您可以使用-o仅获取匹配的元素。。请参阅edit@Anish抱歉..我以前错过了扩展标志。新的更新将按预期工作..E标志将有助于识别{}作为有效的正则表达式charsHow,您是否定义了一个单词?任何由空格分隔的非空格字符序列?只有连续的字母字符?还有别的吗?编辑您的问题以包含一些示例输入和预期输出,尤其是您认为脚本很难正确处理的情况。