基本的な文字列処理
マッチした文字列を置換する
$ echo 'before text' | sed 's/before/after/' after text
マッチした文字列をすべて置換する
$ echo 'before before before text' | sed 's/before/after/g' after after after text
複数の文字列を一度に置換する
# before1→afterA、before2→afterBに置換 $ echo 'before1before2' | sed 's/before1/afterA/;s/before2/afterB/' afterAafterB
置換時にマッチしたキーワードを再利用する
# githubというマッチしたキーワードを&で再利用 $ echo 'github' | sed 's/github/I like &./' I like github.
1文字づつ置換する
# eとoをEとOに置換する $ echo -e "book\nball\norange\nmelon\npen\nmouse" | sed 'y/eo/EO/' bOOk ball OrangE mElOn pEn mOusE
範囲を限定したテキスト処理
最初にマッチしたものだけ置換する
# 1行目からccccのある行までを探索し、ccccをeeeeに置換 # sの前には1,3とか数値だけを指定してもいい $ echo -e "aaaa\nbbbb\ncccc\ndddd\ncccc" | sed '1,/cccc/s/cccc/eeee/' aaaa bbbb eeee # 最初にマッチしたので置換されている dddd cccc # 最初のマッチじゃないため置換されない
指定範囲の行を削除する
# aaaaからccccまでの範囲を削除 $ echo -e "aaaa\nbbbb\ncccc\ndddd" | sed '/aaaa/,/cccc/d' dddd # 1行目から2行目までを削除する $ echo -e "aaaa\nbbbb\ncccc\ndddd" | sed '1,2d' cccc dddd # 空行または#で始まるコメント行削除 $ echo -e '1:one\n2:two\n\n# 3:three\n4:four' | sed '/^$/,/^#/d' 1:one 2:two 4:four
指定範囲の行を表示する
# aaaaからccccまでの範囲を表示 $ echo -e "aaaa\nbbbb\ncccc\ndddd" | sed -n '/aaaa/,/cccc/p' aaaa bbbb cccc # 3行目から最後の行までの範囲を表示 $ echo -e "aaaa\nbbbb\ncccc\ndddd" | sed -n '3,$p' cccc dddd
指定行以外を表示する
# 2行目以外を表示 $ echo -e "aaaa\nbbbb\ncccc\ndddd" | sed -n '2!p' bbbb cccc
ファイル内の指定行のみ出力
# file1.txtの10行目を取得 $ sed -n 10p file1.txt
指定行にデータを挿入
# 1行目に######を挿入(iはマッチ行の手前) # echo -e "aaaa\nbbbb\ncccc\ndddd" | sed '1i\######' ###### aaaa bbbb cccc dddd # 最終行に######を挿入(aはマッチ行の後) # echo -e "aaaa\nbbbb\ncccc\ndddd" | sed '$a\######' aaaa bbbb cccc dddd ######
正規表現を使った文字列置換
実際にコーディングしたり設定を書き換えたりするには正規表現が必須ですね。
マッチした文字列の一部を再利用する
()でくくれば、置換後文字列で\1,\2,\3・・・のように部分的に再利用できます。 ただし()はそれぞれ\(,\)とエスケープしてやる必要があります。
# phpのテンプレコードをruby(erb)コードに変換する $ echo -e "<?php echo 'hogehoge'; ?>" | sed 's/<?php echo \(.*\); ?>/<%= \1 %>/' <%= 'hogehoge' %>