sed を使用して範囲内で逆順にパターン検索を実行し、一致する各行番号を取得します。

sed を使用して範囲内で逆順にパターン検索を実行し、一致する各行番号を取得します。

特定の範囲内のパターンを逆順で検索したいと思います。たとえば、私が提供した範囲に私が提供した範囲が2,8である場合、検索は逆の順序で実行する必要があります。つまり、検索は8行目から2行目まで実行する必要があり、どの行でもパターンと一致すると行番号が印刷されます。

次のような入力ファイルがあるとしましょう。

Hello world
Hello Universe
Hello Universe
Hello Maths
Hello Physics
Hello Earth
Hello Universe
Hello Tennis
Hello God
Hello Teacher

したがって、ファイルには10行があります。それでは、8行と2行の間の入力を検索したいと思います Hello Universe。したがって、出力は私たちが一致した行番号でなければなりません。Hello Universe

したがって、上記の例によると、出力は次のようになります。

7
3
2

このコマンドを試しましたが、sed -n '!G;h;2,8{\|Hello Universe|=}' a.txt実際には昇順で検索を実行します。

インターネットで検索した結果、sed '1!G;h;$!d' a.txt実際にはファイルが逆順に印刷されることがわかりました。各パターンマッチングで行番号を逆順に印刷するようにこのコマンドを変更したかったのです。

それでは、コマンドをどのように変更できますか?助けてください

答え1

テキストファイルの200〜250行でのみ一致するものを探したいのですが~からtac250と200以前は、ファイルを逆順に印刷するのが簡単な解決策でした。次に、を使用してgrep -nパターンを検索し、行番号と小さなPerlスクリプトを印刷して、行番号を元のファイルの正しい番号に変更できます。このような:

sed -n '200,250p' file | tac | grep -n "$pattern" | perl -pe 's/(^\d+)/251-$1/e'

テストファイルを生成する場合:

printf 'Line number %d\n' {1..400} > file

その後、21パターンで210〜219行と221行を取得する必要があります。

$ sed -n '200,250p' file | tac | grep -n 21 | perl -pe 's/(^\d+)/251-$1/e'
221:Line number 221
219:Line number 219
218:Line number 218
217:Line number 217
216:Line number 216
215:Line number 215
214:Line number 214
213:Line number 213
212:Line number 212
211:Line number 211
210:Line number 210

関連情報