私はシグウィンを使用しています。
私はすでに私の手のライン#を知っています。スクリプトは、指定された行番号の上にある文字列の最初の出現を見つけ、指定された行番号の下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行目を除くすべての出力を抑制- 4行目で予約済みスペースをパターンスペース()に移動し、次のコマンドを使用して
g
単語の前のすべてのエントリを削除します。mono
s
: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