sedで複数行処理
使ってみようNを
sedは行単位で処理する
foo
bar
baz
qux
sed -e 's/ba.*/vanitas/'
foo
bar
baz
qux
sed -e 's/ba.*/vanitas/'
foo
bar
baz
qux
foo
bar
baz
qux
sed -e 's/ba.*/vanitas/'
foo
vanitas
baz
qux
foo
bar
baz
qux
sed -e 's/ba.*/vanitas/'
foo
vanitas
vanitas
qux
foo
bar
baz
qux
sed -e 's/ba.*/vanitas/'
foo
vanitas
vanitas
qux
複数行を処理したい!
<data>
this is data.
</data>
sed -e 's!(<data>)n.*(</data>)!12!'
<data>
this is data.
</data>
sed -e 's!(<data>)n.*(</data>)!12!'
<data>
this is data.
</data>
<data>
this is data.
</data>
sed -e 's!(<data>)n.*(</data>)!12!'
<data>
this is data.
</data>
<data>
this is data.
</data>
sed -e 's!(<data>)n.*(</data>)!12!'
<data>
this is data.
</data>
そこでN
N
現在の処理領域に次の行を追加する
<data>
this is data.
</data>
sed -e 'N;N;s!(<data>)n.*(</data>)!12!'
<data>
this is data.
</data>
sed -e 'N;N;s!(<data>)n.*(</data>)!12!'
<data>
this is data.
</data>
<data>
this is data.
</data>
sed -e 'N;N;s!(<data>)n.*(</data>)!12!'
<data>
this is data.
</data>
<data>
this is data.
</data>
sed -e 'N;N;s!(<data>)n.*(</data>)!12!'
<data>
this is data.
</data>
<data>
this is data.
</data>
sed -e 'N;N;s!(<data>)n.*(</data>)!12!'
<data></data>
現実は甘くない
foo
<data>
this is data.
</data>
sed -e 'N;N;s!(<data>)n.*(</data>)!12!'
foo
<data>
this is data.
</data>
sed -e 'N;N;s!(<data>)n.*(</data>)!12!'
foo
<data>
this is data.
</data>
foo
<data>
this is data.
</data>
sed -e 'N;N;s!(<data>)n.*(</data>)!12!'
foo
<data>
this is data.
</data>
foo
<data>
this is data.
</data>
sed -e 'N;N;s!(<data>)n.*(</data>)!12!'
foo
<data>
this is data.
</data>
foo
<data>
this is data.
</data>
sed -e 'N;N;s!(<data>)n.*(</data>)!12!'
foo
<data>
this is data.
</data>
<data>
this is
data.
</data>
sed -e 'N;N;s!(<data>)n.*(</data>)!12!'
<data>
this is
data.
</data>
sed -e 'N;N;s!(<data>)n.*(</data>)!12!'
<data>
this is
data.
</data>
<data>
this is
data.
</data>
sed -e 'N;N;s!(<data>)n.*(</data>)!12!'
<data>
this is
data.
</data>
<data>
this is
data.
</data>
sed -e 'N;N;s!(<data>)n.*(</data>)!12!'
<data>
this is
data.
</data>
<data>
this is
data.
</data>
sed -e 'N;N;s!(<data>)n.*(</data>)!12!'
<data>
this is
data.
</data>
現実への対処法
<data>
this is
data.
</data>
sed -f remover.sed
<data>
this is
data.
</data>
sed -f remover.sed
# remover.sed
:a
N
s!(<data>).*(</data>)!12!
Ta
P
D
<data>
this is
data.
</data>
sed -f remover.sed
# remover.sed
:a
N
s!(<data>).*(</data>)!12!
Ta
P
D
<data></data>
<data>
this is
data.
</data>
sed -f remover.sed
# remover.sed
:a
N
s!(<data>).*(</data>)!12!
Ta
P
D
<data></data>
FIN
:a
N
s!(<data>).*(</data>)!12!
Ta
P
D
:a
N
s!(<data>).*(</data>)!12!
Ta
P
D
:label
labelを定義する
:a
N
s!(<data>).*(</data>)!12!
Ta
P
D
N
現在の処理領域に次の行を追加する
:a
N
s!(<data>).*(</data>)!12!
Ta
P
D
T label
sコマンドが成功していなければ、labelに分岐する
:a
N
s!(<data>).*(</data>)!12!
Ta
P
D
P
処理領域の内容を最初の改行まで出力する
:a
N
s!(<data>).*(</data>)!12!
Ta
P
D
D
処理領域の内容を最初の改行まで(あるいは全て)削除する
:a ラベルa
N 一行追加
s!(<data>).*(</data>)!12!
Ta 置換失敗ならaへ
P 処理領域出力
D 処理領域削除
:a ラベルa
N 一行追加
s!(<data>).*(</data>)!12!
Ta 置換失敗ならaへ
P 処理領域出力
D 処理領域削除
<data>
this is
data.
</data>
:a ラベルa
N 一行追加
s!(<data>).*(</data>)!12!
Ta 置換失敗ならaへ
P 処理領域出力
D 処理領域削除
<data>
:a ラベルa
N 一行追加
s!(<data>).*(</data>)!12!
Ta 置換失敗ならaへ
P 処理領域出力
D 処理領域削除
<data>
this is
:a ラベルa
N 一行追加
s!(<data>).*(</data>)!12!
Ta 置換失敗ならaへ
P 処理領域出力
D 処理領域削除
<data>
this is
:a ラベルa
N 一行追加
s!(<data>).*(</data>)!12!
Ta 置換失敗ならaへ
P 処理領域出力
D 処理領域削除
<data>
this is
:a ラベルa
N 一行追加
s!(<data>).*(</data>)!12!
Ta 置換失敗ならaへ
P 処理領域出力
D 処理領域削除
<data>
this is
:a ラベルa
N 一行追加
s!(<data>).*(</data>)!12!
Ta 置換失敗ならaへ
P 処理領域出力
D 処理領域削除
<data>
this is
data.
:a ラベルa
N 一行追加
s!(<data>).*(</data>)!12!
Ta 置換失敗ならaへ
P 処理領域出力
D 処理領域削除
<data>
this is
data.
:a ラベルa
N 一行追加
s!(<data>).*(</data>)!12!
Ta 置換失敗ならaへ
P 処理領域出力
D 処理領域削除
<data>
this is
data.
:a ラベルa
N 一行追加
s!(<data>).*(</data>)!12!
Ta 置換失敗ならaへ
P 処理領域出力
D 処理領域削除
<data>
this is
data.
:a ラベルa
N 一行追加
s!(<data>).*(</data>)!12!
Ta 置換失敗ならaへ
P 処理領域出力
D 処理領域削除
<data>
this is
data.
</data>
:a ラベルa
N 一行追加
s!(<data>).*(</data>)!12!
Ta 置換失敗ならaへ
P 処理領域出力
D 処理領域削除
<data>
this is
data.
</data>
:a ラベルa
N 一行追加
s!(<data>).*(</data>)!12!
Ta 置換失敗ならaへ
P 処理領域出力
D 処理領域削除
<data></data>
:a ラベルa
N 一行追加
s!(<data>).*(</data>)!12!
Ta 置換失敗ならaへ
P 処理領域出力
D 処理領域削除
<data></data>
:a ラベルa
N 一行追加
s!(<data>).*(</data>)!12!
Ta 置換失敗ならaへ
P 処理領域出力
D 処理領域削除
<data></data>
# output
<data></data>
:a ラベルa
N 一行追加
s!(<data>).*(</data>)!12!
Ta 置換失敗ならaへ
P 処理領域出力
D 処理領域削除
# output
<data></data>
これでxmlも怖くない!

sedで複数行処理 使ってみようNを