sed

sed 活用法 2006/07/03

sed - stream editor 一行づつ非対話的にテキスト処理(フィルタ処理)を行う。処理後は標準出力へ。

起動法
sed command コマンドが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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。