間違いしかない自分用sedめも

sedは標準入力とかファイルから文字列を一行ずつ読み込んで処理する。読み込んだ文字列はパターンスペースってところにぶち込まれて、置換とかあれやこれやされる。あれやこれや処理されたあと、パターンスペースの内容が吐き出されて、次の行に処理が移る。
要するにsedがやることはこんな感じ

  1. 一行よみこんでパターンスペースにぶち込む
  2. パターンスペースをいじくりまわす
  3. パターンスペースを出力
  4. 1.に戻る

3.での出力は処理したかどうかに関係ない。だから

hoge@fuga% sed -e "" hoge

は、hogeから一行読み込んでは出力するのでcatと同じになる。-nオプションは3.をしないためのオプションで、

hoge@fuga% sed -ne "" hoge

とかやると何も表示されない。

functionその1

パターンスペースで正規表現に最初マッチしたのを置換する。最後のスラッシュのあとにgをつけると全部置換する。

hoge@fuga% echo "hogeeehogeeehogeee" | sed -e "s/hoge/fuga/"
fugaeehogeeehogeee
hoge@fuga% echo "hogeeehogeeehogeee" | sed -e "s/hoge/fuga/g"
fugaeefugaeefugaee
  • p

標準出力に出力する。

hoge@fuga% sed -ne "p" hoge

はcatと同じになる。3.を手動でするようなもん。

  • d

パターンスペースを消して次の行を処理する。

hoge@fuga% sed -e "d" hoge

パターンスペースに読み込んだのを消してくからなんもでん。

重要

functionはセミコロンを使うと並べれる。並んだのは左から逐次実行される

hoge@fuga% echo "hogeeehogeeehogeee" | sed -e "s/hoge//; s/hoge//" 
eeeehogeee
hoge@fuga% echo "hogeeehogeeehogeee" | sed -e "s/hoge//; p; s/hoge//"
eehogeeehogeee
eeeehogeee

ワンライナーだと謎だけど、要するに

s/hoge//;
p;
s/hoge//

ってこと

アドレスその1

アドレスってのは、処理対象にする行のこと

アドレス function

で対象のアドレスにだけを処理する

アドレス, アドレス function

で、最初のアドレスから次のアドレスまでの間の行を処理する

正規表現にマッチする行を処理

hoge@fuga% < hoge
<hoge>
  <fuga>
</hoge>
<moge />
<moge />
<moge />
<hoge>
  <piyo>
</hoge>
hoge@fuga% sed -e "/<hoge>/, /<\/hoge>/d" hoge 
<moge />
<moge />
<moge />
  • 数字

行数が数字の行だけ処理

hoge@fuga% < hoge
<hoge>
  <fuga>
</hoge>
<hoge>
  <piyo>
</hoge>
hoge@fuga% sed -e "2 d" hoge
<hoge>
</hoge>
<hoge>
  <piyo>
</hoge>
hoge@fuga% sed -e "2 d; 5 d" hoge
<hoge>
</hoge>
<hoge>
</hoge>
hoge@fuga% sed -e "2,5 d" hoge
<hoge>
</hoge>

ブロック

ブレースで囲んだところに同じ書き方をつかえる

hoge@fuga% < hoge  
<hoge>
  <fuga>
    <moge />
  </fuga>
  <moge />
</hoge>
<moge />

hoge@fuga% sed -e "/<hoge>/,/<\/hoge>/ {/moge/ d;}" hoge
<hoge>
  <fuga>
  </fuga>
</hoge>
<moge />

みやすくすると

/<hoge>/,/<\/hoge>/ {
  /moge/ {
    d;
  }
}

こうなる

っちゅうか

Manpageでだいたい書いてるやん。ってことに気づいたのでねる