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」コマンドはスクリプトとオプションの種類、組み合わせによって書式が少し違っていたりと間違いやすい部分もありますが、理解したうえで活用できると非常に便利になります。少しでも分かりにくい部分が解決されましたら幸いです。ここまで読んでいただきありがとうございました。