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が言ったように)line1
はred
line *
で、line$
はgreen
line **なので、最初のtry()は「チョーク」です。1d;$d;
この行(実際にはみんな/colordata行)が範囲から除外されotherdata
ました。 __________ * つまり、最初の行/start_data/,/end_data/
みんな
一致する範囲**だけでなく、入力ファイル、つまり最後の行みんな一致範囲だけでなく入力ファイル
しかし、あなたのコマンドが次のような出力を生成するということですか?
one
two
three
four
end_data
そうでなければ意味がないからです。start_data
以前は行1(つまり、存在しないred
場合orange
)