2つのパターン間のすべての内容を印刷し、結果出力の最初の行と最後の行を削除します。

2つのパターン間のすべての内容を印刷し、結果出力の最初の行と最後の行を削除します。
otherdata
otherdata
start_data
one
two
three
four
end_data
otherdata
otherdata

結果の出力は次のようになります。

one
two
three
four

sedこれは私にとって仕事のようです。

sed -n '/start_data/,/end_data/{1d;$d;p}' myfile

動作しません。最初の行は削除されますが、最後の行は削除されません。 (これまでは何の理由も論理的に説明できません)

さて、醜い方法を試してみましょう:

sed -n '/start_data/,/end_data/{/start_data\|end_data/!p}' myfile

公平に言えば、これはうまくいきます。しかし、私はより短い方法でも動作したいです。結果出力は次のとおりですいつも中間のデータのみが抽出されるため、最初の行と最後の行には両方のパターンが含まれます。

中かっこ内で and 文を結合しようsedとすると、なぜ息が詰まるのでしょうか。1d$d

ベストアンサー1

ロジックを逆に変更できます。

sed '1,/start_data/d;/end_data/,$d'

start_data最初の行にないとします。この問題を解決するには、GNUがある場合はsed代わりに次のようにします。

sed '0,/start_data/d;/end_data/Q'

それはGNUに固有のもの0ですQ。パターンスペースを印刷せずにQ終了するsedので、最初の解決策のようにファイルの残りの部分を読み続けて削除しないので、より効率的です。

おすすめ記事