間違いしかない自分用sedめも
あ
sedは標準入力とかファイルから文字列を一行ずつ読み込んで処理する。読み込んだ文字列はパターンスペースってところにぶち込まれて、置換とかあれやこれやされる。あれやこれや処理されたあと、パターンスペースの内容が吐き出されて、次の行に処理が移る。
要するにsedがやることはこんな感じ
- 一行よみこんでパターンスペースにぶち込む
- パターンスペースをいじくりまわす
- パターンスペースを出力
- 1.に戻る
3.での出力は処理したかどうかに関係ない。だから
hoge@fuga% sed -e "" hoge
は、hogeから一行読み込んでは出力するのでcatと同じになる。-nオプションは3.をしないためのオプションで、
hoge@fuga% sed -ne "" hoge
とかやると何も表示されない。
functionその1
- s/正規表現/ちかん対象/
パターンスペースで正規表現に最初マッチしたのを置換する。最後のスラッシュのあとに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でだいたい書いてるやん。ってことに気づいたのでねる