行番号が異なり、一致する単語の前後の内容のみを返す

行番号が異なり、一致する単語の前後の内容のみを返す

私はシグウィンを使用しています。

私はすでに私の手のライン#を知っています。スクリプトは、指定された行番号の上にある文字列の最初の出現を見つけ、指定された行番号の下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!d4行目を除くすべての出力を抑制
  • 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

関連情報