地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

sed メモ

www.gnu.org

基本的な文字列処理

マッチした文字列を置換する

$ 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' %>