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ので、最初の解決策のようにファイルの残りの部分を読み続けて削除しないので、より効率的です。

答え2

awkこの質問に適しているようです。

$ awk '/end_data/{f=0;};f{print;};/start_data/{f=1;}' myfile
one
two
three
four

上記はフラグを使用してf行を印刷するかどうかを決定します。この場合、start_dataフラグはtrue(1)に設定されます。見つかると、end_dataこのフラグはfalse(0)に設定されます。 true の場合、f行が印刷されます。

中かっこ内に1dと$ d文を結合しようとしたときにsedが窒息するのはなぜですか?

これは「窒息」ではありません。パターンの最初の行と最後の行は参照せず、ファイルの最初の行と最後の行のみを参照し1dます。$d

答え3

まあ、これはうまくいきます:

sed -ne/start_data/!d\;:n -e'n;/end_data/q;p;bn' <in

pそのアドレスの最後の行に出会い、移動するまでリントを試みません/start_pattern/。改行が一致するものを取得すると、n現在の行をext、uit入力で完全に置き換え、それ以外の場合はリントします。これだ。サンプルデータに基づいて、出力は次のようになります。q/end_data/p

one
two
three
four

1行を次のように認識しません。end_data最初の項目とも一致すると一致します。start_data入力に表示される行です。

答え4

ここでは、質問に提供された入力ファイルを簡単に修正してみましょう。

% cat myfile
red
orange
start_data
one
two
three
four
end_data
yellow
green

私は単にotherdata別のデータで行を置き換えて、「最初の行」と言うことなく、入力ファイルの各行をその内容として一意に参照できるようにしました。 「最初の行otherdata」は少し長いためです(そして私が理解しているものは誤解されるかもしれません)。

今、最初の試みに最も近いものは次のとおりです。

% sed -n '/start_data/,/end_data/p' myfile | sed '1d;$d'
one
two
three
four

sed -n '/start_data/,/end_data/{1d;$d;p}' myfile(John1024が言ったように)line1redline * で、line$greenline **なので、最初のtry()は「チョーク」です。1d;$d;この行(実際にはみんな/colordata行)が範囲から除外されotherdataました。 __________ * つまり、最初の行/start_data/,/end_data/

みんな
一致する範囲**だけでなく、入力ファイル、つまり最後の行みんな一致範囲だけでなく入力ファイル


しかし、あなたのコマンドが次のような出力を生成するということですか?

one
two
three
four
end_data

そうでなければ意味がないからです。start_data 以前は行1(つまり、存在しないred場合orange

関連情報