sed 活用法 2006/07/03
sed - stream
editor 一行づつ非対話的にテキスト処理(フィルタ処理)を行う。処理後は標準出力へ。
起動法
sed
コマンドが1つの場合
sed -e command1 -e command2 コマンドが複数ある場合
sed 'command1;command2;..' (同上)
sed -f command_file
-----command_file----
command1
command2
..
---------------------
コマンド形式
[ address1 [, address2 ] ] function
address1のみ指定:そのパターンにマッチする行のみ functionを適用。
address1とaddress2を指定:address1にマッチする行からaddress2にマッチする行までに対し fucntionを適用。
複数のfunctionは{
function1
fucntion2
...
}
sedのアドレス指定
アドレス |
意味 |
line-number |
line-numberで指定された行 |
$ |
最後の行 |
/regular-expression/ |
正規表現 regular-expression にマッチした行 |
例)
10p 10行目にp関数を適用
/^a/,/^b/p aではじまる行からbではじまる行までp関数を適用
p すべての行にp関数を適用
基本的な関数
d - delete 削除
例 cat hoge.txt | sed '/^END/,/^BEGIN/d' ... ENDとBEGINで囲まれた行を削除
(Windows上では、' とか `はだめで、" が使用可。GNU sed 3.02)
p - print 表示
-n オプションで処理結果の標準出力を抑制した場合、pで表示(パターンにマッチ行だけを選択的に出力)
例 cat -n words | sed -n '100,150p' 100行目から150行目を表示
q - quit 途中で終了
例 上記で105行目を出力後、sedを終了した方が早く処理を終え得る。
% time cat -n words | sed -n '100,150p'
% time cat -n words | sed -n -e '100,150p' -e '105q'
s - substitute 置換
s / regular-expression / replacement / flags
regular-expressionにマッチする最初の文字列をreplacementで置換
フラグ |
意味 |
g |
正規表現にマッチする文字列すべてを置換(defaultでは最初のみ) |
p |
マッチした場合に行を出力 |
マッチする文字列の参照
数値をN=数値 という形式に置換
s/\([0-9][0-9]*\)/N=\1/
s/\([0-9][0-9]*\)/N=&/ &でマッチする文字列全体
% who am i
mari ttyp7 Dec 24 02:26 (pkm)
who am i | sed 's/^.*(\(.*\)).*$/\1/' => pkm
mv コマンドで .c を.ccに一括変換
ls *.c | sed -n 's/\(.*\)\.c$/mv & \1.cc/p' 照準出力に表示のみ
ls *.c | sed -n 's/\(.*\)\.c$/mv & \1.cc/p' | sh 出力結果をshに渡して実際にmvを実行
y - transform 変換
y / old-strings / new-strings /
文字単位で置換 trコマンドに同じ。
y/aiueo/AIUEO/
高度なsed関数
(1)分岐
:label ジャンプ先ラベルを定義
b label ラベルlabelに分岐 branch
t label 直前のs関数の置換が成功していれば、ラベルに分岐 test
eg) cat palindrome
s/^.*$/&@@&/ 行を単語@@単語 に変換
:Loop
s/^\(.\)\(.*\)@\([^@]*)@\(.*\)/\2@\1\3@\4/ 行頭の文字を最初の@の後に挿入
t Loop 置換が失敗するまで繰り返し
s/^.\([^@][^@]}\)@\1/\1/p 2つの単語が一致していれば出力
(2)中間結果の保存
sedの入力行はパターンスペースに保存され、置換などの処理はパターンスペースに対して行われる。このほか、ホールドスペースという領域があり、処理中の行を一時的に置き、パターンスペースに取り出すことができる。
pattern spaceとhold spaceの操作
| 関数 | 動作|
| h| pattern spaceをhold spaceにコピー|
| g| hold space をpattern space にコピー|
処理の流れ
・入力行をパターンスペースに(自動的)
・パターンスペースをホールどスペースに
・パターンスペースを処理し、出力
・ホールドスペースをパターンスペースへ
・パターンスペースを別の処理をし、出力
cat words 単語を1つづつ取り出す
:Loop
s/^[^A-Za-z]*// 行頭の非英文文字を削除
sh
s/^\([A-Za-z][A-Za-z0-9]*\).*/\1/p 行頭の単語以降の文字を削除して表示
g
s/-[A-Za-z][A-Za-z0-9]*// 行頭の単語を削除
/./b Loop 行が空になるまで繰り返す。
最終更新:2009年02月06日 13:49