Hatena::ブログ(Diary)

Shouheiのメモ

2008-06-26

sed usage

| 14:22

参考

http://www.edu.ics.saitama-u.ac.jp/~j0114ky/first/html_enshu/9.3.html

http://www.nurs.or.jp/~sugi/sed.htm

http://ja.wikipedia.org/wiki/Sed_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)

sed=StreamEDitor

edのStream版

[基本]

$sed -e 's/検索文字列/置換文字列/g' *.old > *.new ;-e 以下に続くスクリプトを用いて処理

$sed -e 's/検索文字列/d' *.old > *.new ; dで検索文字列を削除

$sed -f *.sed *.old > *.new ;-f ファイルからの読み込んで処理

$sed -e '/検索文字列/置換文字列/g' *.old > *.new : sを取ると、マッチした行すべてを置換文字列で置換

つまり、処理はs=文字列,y=文字,null=行に対して行われる

$ cat henkan.sed

s/linux/リナックス/g

s/windows/ウインドウズ/g

s/mac/マック/g

$sed -e s/A/B/ ; 文字列AをBで置換

$sed -e y/A/B/ ; 文字AをBで置換

[発展]

パターンスペース(PS)とホールドスペース(HS)

通常の処理空間がパターンスペース(PS)

裏のバッファがホールドスペース(HS)

s/A/B/g

g:PSにHSの内容をコピーする.元のPSの内容は上書きで消される.

G:PSの末尾にHSの内容が追加される.PSの末尾の改行は保持される.

h:PSの内容をHSにコピーする.元のHSの内容は上書きで消される.

H:PSの内容をHSの末尾にコピーする.

x:PSの内容とHSの内容を入替える(交換する).

(汎例)

1行目だけを置換

$ sed '1s/linux/リナックス/g' *.old > *.new

1〜10行目だけを置換

$ sed '1,10s/linux/リナックス/g' *.old > *.new

2行目から最終行までを置換

$ sed '2,$s/linux/リナックス/g' *.old > *.new

1行目から先頭がlではじまる行までを置換

$ sed '1,/^l/s/linux/リナックス/g' *.old > *.new

先頭がlではじまる行だけを置換

$ sed '/^l/s/linux/リナックス/g' *.old > *.new

先頭がlではじまる行以外を置換

$ sed '^I/!s/リナックス/g' *.old > *.new

g は置換対象が複数あるとき全てを置換

g をはずすと、最初に見付かったもののみが対象となる

正規表現

名前が Kで始まる人をイニシャル K で置き換え

$sed 's/^K[a-z]*,/K,/' filename

K.Sugioka,杉岡 研史

Hanako Yamada,山田 花子

K.Hiroshi,加藤 博

Hidetoshi Nakata,中田 英俊

行末の文字を消す

$ sed -e "s/Text\$//" *.old > *.new ;\でエスケープして$

行頭の文字を消す

$ sed -e "s/^Text//" *.old > *.new

ドット(.)とアスタリスク(*)

.は「任意の1文字」の意味

*は「直前の文字が任意の個数連続した場合(0個も含む)」の意味

$ sed -e "s/.*/hello/"

ホワイトスペースを1個のスペースに変換

ホワイトスペースはタブかスペースのこと

orで処理してる

$ sed -e 's/[ ][ ]*/ /g'

行の削除

ファイルの1行目を削除

$ sed -e '1d' file

最初の4行を消す

$ sed -e '1,4d' file

最終行を消す

$ sed -e '$d' file

ファイルの最後の4行を削除

$ sed -e '$-3,$d' file

[超発展]

ファイルを後ろから表示する(ログファイル等に用いる)

grepで行番号付きとして、逆順にソートして、付けた行番号を削除

$ cat logfile | grep -n '.*' | sort -n -r | sed 's/^.*://'

次の場合は、ファイルそのものを書き換えてしまいます。

$ ed - file <<-!

g/^/m0

w

q

!

$

トラックバック - http://d.hatena.ne.jp/Shouhei/20080626/1214457733