特定のライン間パターン検索とライン番号の印刷

特定のライン間パターン検索とライン番号の印刷

20行のファイルがあります。 10行目と15行目の間の文字列を検索して、元のファイルの行番号とともにその文字列を印刷したいと思います。

頑張りましたsed -n 10,15p file | grep -n "pattern"

上記のコマンドの問題は、ライン番号10の出力がラインsed番号1になることですgrep

したがって、元のファイルの行番号は印刷されません。

答え1

誰かと一緒に働くとき、sed私は通常、可能な結果の範囲を絶えず絞り込むのが最も簡単であることがわかりました。これが私が時々!否定演算子に依存する理由です。興味深い入力を選択的に選択するよりも、興味深い入力を削除する方が簡単です。少なくともこの問題に対する私の考えはそうです。

私はこのアプローチがsedスクリプトの最後にパターンスペースを自動的に印刷するデフォルトの動作と一致していると思います。このような簡単な操作では、強力なスクリプト(いくつかの実装された構文拡張に依存せずに動作するスクリプト)を簡単に生成できます。(一般的にsed {functions}

そのため、次のことをお勧めします。

sed '10,15!d;/pattern/!d;=' <input

...最初に10行と15行の範囲内にない行を切り取り、残りの行から一致しない行を切り取りますpatternsed一致する行と同じ行に行番号を印刷したい場合は、pasteその場合を検討してください。おそらく...

sed '10,15!d;/pattern/!d;=' <input |
paste -sd:\\n -

...これは、入力行を\n1:文字または別の\n行に置き換えます。

たとえば、

seq 150 |
sed '10,50!d;/5/!d;=' |
paste -sd:\\n -

...印刷...

15:15
25:25
35:35
45:45
50:50

答え2

解決策は次のとおりですawk

awk '10<=NR && NR<=15 && /pattern/ {print NR,$0}' file

使用する必要がある場合ただ sedそして、次のことを考えてみましょう。

sed -n '10,15 {/pattern/ {=;p}}' file | sed 'N;s/\n/ /'

sedの=コマンドは、別の行にのみ行番号を印刷します。上記の2番目のインスタンスは、sed行番号がその行の前に表示されるように両方の行を結合します。

答え3

使用nl:

nl file | sed -n '10,15{/pattern/p
}'

関連情報