仅返回匹配单词不同的行号前后的内容

仅返回匹配单词不同的行号前后的内容

我正在使用cygwin。

我已经知道我手中的line#。脚本应查找mono指定行号上方字符串的第一次出现,并查找指定行号下方字符串的第一次出现,并仅返回和/mono之间的内容。 mono/mono

输入:

I have known line # in my hand.  
Script should look for the first occurrence of word mono  
not monoono  
above a specified line #  
and look for the  
first occurrence of word /mono below the specified line #s  
and return ONLY the contents between those 'mono' and /mono  

预期输出

mono 
not monoono  
above a specified line #  
and look for the  
first occurrence of word /mono  

我怎样才能做到这一点?

答案1

GNU 的紧凑版本sed

sed -E 'H;4!d;g;s/.*\<mono\>/mono/;:a;N;s_/mono\>.*_/mono_;Ta' in

解释:

  • H收集保留空间中的所有行
  • 4!d抑制除第四行之外的所有输出
  • 在第 4 行,将保留空间移动到模式空间 ( ) 并使用命令删除g单词之前的所有内容monos
  • :a; ... ;Ta形成一个循环,附加行N直到/mono被读取

答案2

awk -v L=4 '(NR<L && $0 ~ /\<mono\>/){Pnr=NR;gsub(/^.*\<mono\>/,"mono"); P=$0;next}
     (!Nnr && $0 ~ /\/\<mono\>/){Nnr=NR;gsub(/\/\<mono\>.*/,"/mono"); N=$0}
     (NR!=FNR && P){print P;P=""}(FNR>Pnr && FNR <Nnr ){print} END{print N}' in in 

mono将产生~之间的结果/mono:此处在特定第 4 行周围首次出现。

mono
not monoono
above a specified line #
and look for the
first occurrence of word /mono

如果您不想在匹配后匹配行图案,这将是最短的:

awk -v L=4 '(NR<L && $0 ~ /\<mono\>/){Pnr=NR;next}
    (!Nnr && $0 ~ /\/\<mono\>/){Nnr=NR}
    (FNR>Pnr && FNR <Nnr)' in in

相关内容