支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡

  • TOP
  •   
  • コラム
  •   
  • Linuxコマンド:sedの基礎とオ

はじめに

Linux上で全ての文字列を置換処理を行ったり指定した範囲の文字列を抽出・削除を行ったりと様々なテキスト編集を行うコマンド「sed:Stream Editor」の基本的な使い方とオプションについて説明を行っていきます。

Linuxコマンド「sed」の基本

「sed」コマンドはオプションや書式によって様々な機能を発揮します。その例として以下には文字列の「指定条件にマッチする最初の文字列を一時的に置換処理」「指定条件にマッチする全ての文字列を置換処理」「指定条件にマッチする文字列を置換した上で上書き処理」「指定文字列を削除処理」「空白文字を削除する」「空行を削除する」「指定する行の前後にテキストを挿入する」「指定キーワードの前後にテキストを挿入する」処理コマンドを記載します。

基本書式

$ sed [オプション](スクリプトコマンド)(入力ファイル)

指定条件に対して各行上で最初にマッチしたものだけ置換処理

$ sed s/AAA/aaa/ Linux.txt

上記のコマンドでは「Linux.txt」内にある文字列でAAAと最初に合致した文字列をaaaに置換処理しています。また注意するべきは「各行」で最初に条件合致されると置換処理されるため、行が変わるとその行で最初に合致した文字列は置換処理されます。

[実行例]111AAA222aaa→111aaa222aaa

条件に合致する文字列を全て置換処理

$ sed s/AAA/aaa/g Linux.txt

「Linux.txt」内にある文字列でAAAという文字列は全てaaaに置換処理されます。

[実行例]111AAA222aaa333AAA444aaa→111aaa222aaa333aaa444aaa

置換処理をした結果でファイル内容を上書き

$ sed -i s/AAA/aaa/ Linux.txt

後述するオプションコマンド「-i」を利用することで置換処理を行った後、自動的にファイル内容の変更も行えます。

111AAA222aaa→111aaa222aaa(Linux.txt内容保存)

指定行を削除処理

$ sed '①,②' Linux.txt

①、②にそれぞれ数字を入れることで「①~②行目を削除」という風に指定した行を削除することが出来ます。

[例]$ sed '3,4' Linux.txt

aaa      aaa

bbb      bbb

ccc   →   eee

ddd

eee

空白を削除処理

$ sed 's/ //g' Linux.txt

ファイル「Linux.txt」内の空白「 」を削除します。

111 AAA 222 aaa 333 AAA → 111AAA222aaa333AAA

空行を削除処理

$ sed '/^$/d' Linux.txt

aaa    aaa

      bbb

bbb    ccc

    →  ddd 

ccc    

ddd

指定した行の前後にテキストを挿入

[i:指定位置の前に挿入します]$ sed '2i AAAAA' Linux.txt

aaa     aaa

bbb  →  AAAAA

ccc     bbb

       ccc

[a:指定位置の後に挿入します]$ sed '2i AAAAA/BBBBB' Linux.txt

aaa     aaa

bbb     bbb

ccc  →  AAAAA

       BBBBB

       ccc

[a:指定キーワードの前後に挿入します]$ sed '/bbb/i AAAAA' Linux.txt

aaa     aaa

bbb     AAAAA

ccc  →  bbb

       ccc

「sed」コマンドの主なオプション一覧

[-e(スクリプト)](--expression=スクリプト):スクリプト(コマンド)を追加します。

[-E]:拡張正規表現を使用します。

[-f(スクリプト)](--file=スクリプトファイル):スクリプトファイルの内容を実行するコマンドとして扱い追加します。

[-i](-in-place):結果を出力せずに直接ファイルを編集します。

[-i(拡張子)](--in-place=拡張子):結果を出力せずにファイルを直接編集したうえで指定した拡張子でバックアップを行います。※-iと拡張子の間には空白を入力しないように注意してください。

[--follow-symlinks]:[-i]で処理を行う際にシンボリックリンクをたどります。

[-n](--silent)(--quiet):出力コマンド以外の出力を行いません。※デフォルトで処理しなかった行に対しては通常通り出力されます。

[-l(文字数)](--line-length=文字数):lコマンドの出力行を折り返す長さを指定します。※[-l]と文字数の間には空白を入れます

[s](--separate):複数の入力ファイルを一続きのストリームとして扱わずに個別のファイルとして扱います。

[-u](--unbuffered):入力ファイルからデータをごく少量ずつ取り込み、頻繁に出力バッファーを出力します。

[-r](--regexp-extended):スクリプトで拡張正規表現を使用します。

[-z](--null-data):NUL文字で行を分割します。※通常は改行で分割処理を行います。

[--posix]:全てのGUN拡張機能を無効化します。

「sed」コマンドの主なスクリプトコマンド一覧

[=]:現在の行番号を出力します。

[a(テキスト)]:指定した位置の後ろにテキストを追加します。(※挿入するテキストに改行を含める場合は改行前のテキストに[/]を入力します。)

[i(テキスト)]:指定した位置の後ろにテキストを挿入します。(※挿入するテキストに改行を含める場合は改行前に[/]を入力します。)

[c(テキスト)]:選択した行をテキストに置き換えます。(※挿入するテキストに改行を含める場合は改行前に[/]を入力します。

[q]:入力を中断し、それ以上処理を行わず終了します。(※未出力分があれば出力してから終了します。)

[Q]:ただちに入力・出力を行わずに終了します。

[d]:指定した行を削除します。

[P]:処理した内容を出力します。(※「-n」オプション指定時は「p」コマンドがないと何も出力されなくなります。)

[s/置換前文字列/置換後文字列/]:(置換前文字列)で指定した文字列にマッチした部分を置換後文字列へ置き換えます。また複数マッチした場合は先頭のみ置換を行い、対象全て置換を行う場合は[s/置換前/置換後/g]のように[-g]オプションを併用します。

[y/元の文字列/対象文字列/]:(元の文字列)のものを(対象文字列)の同じ位置に存在する文字列に置換します。(※[tr]コマンドのように使用可能です。)

[#]:コメント(スクリプト中に可能です。#以降がコメント内容になります。)

さいごに

いかがだったでしょうか。主に使用される使用方法とオプション・スクリプトコマンドの説明致しました。文字列や文の添削を行う際に便利な「sed」コマンドはスクリプトとオプションの種類、組み合わせによって書式が少し違っていたりと間違いやすい部分もありますが、理解したうえで活用できると非常に便利になります。少しでも分かりにくい部分が解決されましたら幸いです。ここまで読んでいただきありがとうございました。