|
sed
- 基本
- tips
- 参考文献・参考ウェブページ
sed についてのTIPS。
sed とは、検索置換をコマンドライン上から行う。
基本的な文法は以下。vi の変換に似ているか。
BEFORE : 置換前
AFTER : 置換後
TARGET : 置換対象ファイル名
$ sed "s/BEFORE/AFTER/" TARGET
ファイルへの書き出しなどは、リダイレクト > を使用する。
変換式の引数($2) は""でくくること。
これがないと、正しく変換できない。
- 一行をまとめて変数\1 として扱う。
正規表現.*の周りを¥(と¥)で囲む。つまり、\(.*\) とする。
これは、1行に入っている文字が何であろうとそれを全部指し、かつ、
次回以降それらをまとめて変数\1として表現する。
$ sed "s/\(.*\)/cp \1 \/work\/\1/" list
これはたとえばファイル名を
$ ls . > tmp
として一時的に保存したあとに
$ sed "s/\(.*\)/cp \1 \/work\/\1/" tmp > rename.sh
などとすれば、即席でリネーム(remove, copy, etc.)スクリプトが出来上がる。
$ ./rename.sh
実行属性をしめすために* (アスタリスク) などがls の出力に含まれたら
$ sed "s/*//g" tmp > tmp2
でもしておく
- 最後の引数
sed に対して以下のようにg を最後に指定すると
$ sed "s/BEFORE/AFTER/g" TARGET_FILE
一行に対して複数回変換を実行する。
この辺はvi と一緒。
このg をつけないと、一行の中に変換の文字列があっても一度しか変換されない。
- 2段階の変換(-e オプション)
$ sed -e "s/BEFORE0/AFTER0/g" -e "s/BEFORE1/AFTER1/g" TARGET_FILE
これは以下の2つの変換に相当する。
$ sed "s/BEFORE0/AFTER0/g" TARGET_FILE
$ sed "s/BEFORE1/AFTER1/g" TARGET_FILE
- ファイルからのスクリプト読み込み(-f オプション)
ファイルに以下のように記載する。このとき、sed も
対象ファイル名も"ダブルクォーテーション"もいらない。
保存するファイル名を tmp.sed とする。
s/BEFORE0/AFTER0/g
s/BEFORE1/AFTER1/g
そしてsed を以下のように実行する。
$ sed -f tmp.sed TARGET_FILE
これは以下の2つの変換に相当する。
$ sed "s/BEFORE0/AFTER0/g" TARGET_FILE
$ sed "s/BEFORE1/AFTER1/g" TARGET_FILE
- 行指定
1行目から5行目だけを変換の対象とする。
$ sed "1,5s/BEFORE/AFTER/g" TARGET_FILE
これはvi とまったく一緒。
(というか、vim。というか、vim はsed をcall しているだけか。)
- パターンアドレス指定
以下のようなテキストファイル"test"がある。
$ cat test
SHINNICHI CHONO
SHINNICHI NAGATA
SHINNICHI NAKAMURA
SHINNICHI TENZAN
SHINNICHI NISHIMURA
ZENNICHI MUTOH
ZENNICHI KOJIMAX
ZENNICHI BABA
NOAH MISAWA
NOAH BARNING
NOAH STARNESS
このうち、"SHINNICHI" に対してのみ空白を" (CTU)" に変換したい。
そのときには以下のようにする。
$ sed "/SHINNICHI/s/ / \(CTU\)/g" test
SHINNICHI (CTU)CHONO
SHINNICHI (CTU)NAGATA
SHINNICHI (CTU)NAKAMURA
SHINNICHI (CTU)TENZAN
SHINNICHI (CTU)NISHIMURA
ZENNICHI MUTOH
ZENNICHI KOJIMAX
ZENNICHI BABA
NOAH MISAWA
NOAH BARNING
NOAH STARNESS
すると、"SHINNICHI"を含む行だけが変換の対象となる。
- 行指定とパターンアドレス指定の混在
こうすると併記可能
$ sed "1,/^$/s/BEFORE/AFTER/g" TARGET_FILE
これで1行目と空行(^$) が変換の対象の行となる。
- 削除コマンド
これもアドレスの指定は行指定でもいいし、パターンアドレス指定でもいい。
ex) 1-5 行目削除
$ sed "1,5d" TARGET_FILE
ex) "ZENNICHI" を含む行は削除
$ sed "/ZENNICHI/d" TARGET_FILE
- 追加コマンド
- 挿入コマンド
- ホールドスペース
y/文字列1/文字列2/
パターンスペース中の文字のうち、「文字列1」に含まれる文字を、
「文字列2」の同じ位置にある文字に置き換える。
「文字列1」と「文字列2」は同じ長さでなければならない。
これを利用して以下のようなインクリメントがsed でかける。
y/ 0123456789/11234567890/
しかし、空行が対象にならないように注意
http://www.gcd.org/sengoku/sedlec/9.txt
|
|