0

もっと好奇心が強いですが、これら 2 つの sed コマンドを 1 つに圧縮する方法はありますか?

sed -r '/sometext/!d' file.txt | sed -r '5,10!d'

上記により、「sometext」を含む行の 5 番目から 10 番目のインスタンス (合計 6) が得られます。

連結:

sed -r '/sometext/!d;5,10!d' file.txt

元のファイルの 5 行目から 10 行目に "sometext" が含まれている行のみを表示します。

4

2 に答える 2

2

これはあなたのために働くかもしれません:

# make some test data
# seq 50 > /tmp/a
sed -i 's/.*/& sometext/;n' /tmp/a
# run existing commands
sed -r '/sometext/!d' /tmp/a | sed -r '5,10!d'
sometext
9 sometext
11 sometext
13 sometext
15 sometext
17 sometext
19 sometext
# run new command
sed '/sometext/H;$!d;g;s/\n/&&/5;s/.*\n\n//;s/\n/&&/6;s/\n\n.*//' /tmp/a
9 sometext
11 sometext
13 sometext
15 sometext
17 sometext
19 sometext

説明:

  • 目的の行をホールド スペース (HS) に押し込みます。/sometext/H
  • 最後の行を除くすべての行を削除します。$!d
  • 最後の行を HS の内容で上書きします。g
  • 最初の 5 行を削除します。注: 最初の改行は、Hコマンドのアーティファクトです。s/\n/&&/5;s/.*\n\n//
  • 最初の 6 行を除いてすべて削除します。s/\n/&&/6;s/\n\n.*//'

NB5,10!dコマンドは、5行目から10行目以外をすべて削除することを意味します

于 2012-06-04T07:19:57.217 に答える
1

sed ではありませんが、awk は非常に読みやすいです。

awk '/sometext/ && ++count && 5 <= count && count <= 10' file.txt
于 2012-06-04T11:01:12.627 に答える