アットウィキロゴ

sed

「sed」の編集履歴(バックアップ)一覧に戻る

sed - (2009/02/06 (金) 13:49:01) のソース

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 行が空になるまで繰り返す。
ツールボックス

下から選んでください:

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