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

  • TOP
  •   
  • コラム
  •   
  • Linux系OSで文字を置換する時の

はじめに

Linux系のOSの中にはWindowsのようにGUI(Graphical User Interface)が充実していて、画面を見ながら直感的な操作をする方が向いているものも出てきていますが、基本的には現在もLinuxコマンドで操作されることの多いOSです。人によってはコマンドで操作した方が早い、分かり易いというエンジニアさえいます。

LinuxOSに関わり始めたばかりの初心者であるとこれらコマンドを使いこなしてLinuxの運用ができるようになるため学習が必要となりますが、辞書を勉強するようにアルファベット順にコマンドの利用方法を片っ端から覚えていくのは非常に困難であり、効率が悪いです。また、何のために利用できるコマンドであるかを認識していないと、覚えたとしてもすぐに忘れてしまうでしょう。その点、今回紹介する「sed」コマンドは何のために利用するかが明確で、利用頻度も高いので覚えやすいコマンドです。ぜひこの記事をきっかけに「sed」コマンドの使い方を覚えてしまいましょう。

「sed」コマンドの概要

sedコマンドは、元々1973年にUNIX標準で搭載されていた「stream editor(ストリームエディタ)」という名称の略です。ストリームエディタは、スクリプトを実行することで編集を一括で行える他、複雑な処理にも対応可能であったため、OS間の移植等を繰り返しながら長い間利用されていました。これらの特徴を引き継いている「sed」コマンドは、テキストの置換・追加・削除を単体あるいは一括で可能な機能で、あらかじめ用意されているオプションと合わせて利用することでより複雑な処理も可能になります。置換対象の検索に正規表現が利用できることも大きな特徴なので、より便利に利用したい場合は正規表現についての学習も必要です。

なおsedコマンドのみではファイルのデータを書き換えることはできず、標準出力に出力するだけとなります。置換した内容を保存するにはオプションを利用します。また今回の記事ではLinuxOSでのsedコマンドの利用方法について紹介します。MacOSでもsedコマンドの利用が可能なものの、使い方が多少異なることを覚えておいてください。

「sed」コマンドの基本的な使い方

「sed」の後に各オプションを付け、検索したい文字列、置き換えたい文字列、対象のファイル名を順に記述する方法が基本的な使い方です。例えば「sed -e 's/abc/ABC/' sample.txt」と記述すると、sample.txtというファイルの中にある小文字の「abc」を大文字の「ABC」に置換するという意味になります。「-e」はオプションの一つですが、sedのスクリプトを実行する際に付加します。またこれは決まった形式なのでそのまま覚えることとなりますが「s/(スラッシュ)」の直後に置換前の文字を入れ、「/」を挟んで置換後の文字を入れ、最後に「/」で閉じることで置換が可能となります。

上記の記述のみの場合は、複数がマッチしたとしても先頭しか置換されませんが、全てを置換した場合は末尾の「/」の後に「g」オプションを付加して「sed -e 's/abc/ABC/g' sample.txt」とします。複数の文字を置換したい場合は「sed -e 's/abc/ABC/' -e 's/def/DEF/' sample.txt」と記述することで2パターンの置換を同時に行えるようになります。なおここで紹介した「s/置換前の文字/置換後の文字/」という形式は正規表現を利用しています。

基本的な使い方を紹介した中でもすでにオプションが付加されいることからわかるように、sedコマンドはオプションコマンドが欠かせません。そのため次に各オプションの意味をまとめて紹介していきます。

便利なオプションの使い方

基本的な使い方でも紹介した「-e」はスクリプトを実行する際のオプションで、複数のスクリプトを指定することで複数一括での実行も可能となります。大文字で「-E」とした場合は拡張正規表現を利用する際のオプションとなり意味が異なってくるので注意が必要です。

「-f」はスクリプトが記述されているファイルを指定する際のオプションで、ファイル内のコマンドの実行が可能です。「-i」オプションは、標準出力はせずにファイルを上書きすることが可能です。そのため置換した内容を保存したい時は「-i」を付加しましょう。「-i」の直後に「.(ドット)」を挟んでバックアップファイルの末尾に付与する文字列を指定すると、その名称でバックアップファイルの取得も可能です。例えばsample.txtの中身を置換する前の状態をバックアップを取得したい場合に「sed -i.$(date +%Y%m%d) ’s/abc/ABC/' sample.txt」を実行することで「sample.txt.20220713」というバックアップファイルを生成できます。

「-n」オプションを使うと、修正する行の出力をせず、出力コマンドのみが出力されます。「-l」は、オプションの後に文字数を入力することで、出力する行を折り返す長さ(文字数)を指定することが可能になります。「-r」は「-E」と同様に拡張正規表現を利用する際仕様するオプションです。「-z」は、通常改行で分割処理が行われるところを、NULL文字で行の分割が可能な状態にするオプションです。

またその他Linixコマンドと同様、「--help」を使うとsedコマンドのヘルプが表示でき、「--version」を使うとバージョンの表示が可能です。他にも様々なオプションがありますが、あまり多く紹介しても初めは混乱する可能性があるため、良く使われるものとして今回は以上の紹介に留めておきます。

オプション以外の記号やアルファベトについて

sedコマンドではオプション以外にも「スクリプトコマンド」と呼ばれる様々な記号やアルファベットを組み合わせることがあります。一部、オプションとスクリプトコマンドの両方に含まれるアルファベットがあるため混同しないようご注意ください。

まずは記号系の紹介です。「=」は現在の行番号を出力するコマンド、「#」はコード内でのコメントアウトと同様で、スクリプト中にコメントとして扱う場合のコマンドとなります。

次にアルファベットの紹介です。「a 文字列」とすると指定箇所の末尾に文字列の追加が可能となります。なお改行が必要な場合は、改行前の文字列に「/」を付けます。指定箇所の末尾に何らかのテキストを挿入したい場合は「i 文字列」とします。「c 文字列」とすると、選択した行をテキストに置き換えることが可能となります。

「q」は入力を中断し、以降の処理は行わずに終了が可能となります。なお、その時点で未出力のものがある場合は出力を終えてから終了されます。大文字の「Q」は入力・出力することなく終了できるコマンドです。

「d」は指定した行の削除が可能ですが、単純に「sed d」を実行してしまうと全行が削除されてしまいます。そのため通常は「sed 10,15d」というように削除する行を指定して利用します。この場合は10〜15行目が削除されます。逆に10〜15行目だけ残してその他の行を削除したい場合は「!」を使って「sed 10,15\!d」(\を付けてエスケープする)とします。「p」は処理した内容の出力を行うコマンドで、出力コマンドのみを出力するオプション「-n」と合わせて利用されることが多いです。組み合わせるとpコマンドの内容だけが出力されます。大文字の「P」も同様に処理した内容の出力を行います。

「r ファイル名」とすると、ファイルを先頭に追加することが可能です。なお基本的な使い方で出てきた「s」もコマンドの一つで、正規表現を使って置換処理する場合に利用します。

正規表現で使われるメタ文字について

sedコマンドでは正規表現を扱うことも可能であるため、こちらも学習が必要である旨を紹介しましたが、その正規表現で利用される基本的な「メタ文字」を最後に紹介します。

任意の一文字を表す場合は「*」、直前の1文字(あるいは1パターン)を0回以上繰り返すことを表す場合は「*」、行の先頭を表すには「^」、行の末尾を表すには「$」を利用します。これらは正規表現において頻繁に利用することでしょう。

さらに「[ ]」はこの括弧中に含まれる任意の1文字を表し、「\{n,m\}」は直前の1文字(あるいは1パターン)のn回以上m回以下の繰り返し、「\{n,\}」は直前の1文字(あるいは1パターン)のn回以上の繰り返し、「\{n\}」は直前の1文字(あるいは1パターン)のn回の繰り返しを表します。これらはわずかに記述が異なるだけで意味が異なってくるので使用時は注意が必要です。

「\+」は直前の1文字(あるいは1パターン)の1回以上の繰り返し、「\?」は直前の1文字(あるいは1パターン)の0回または1回のみの出現を表します。「\|」とすると2パターンのうちどちらか一方を表現できます。

まとめ

今回紹介した「sed」コマンドの使い方を覚えて利用することで、例えば変数の変更や記述ミスの修正等が必要となった際もシラミつぶしのようなことをせずにコードの修正が可能となります。なおsedコマンドはファイルの中身を確認する「cat」やファイル、ディレクトリを検索する際に利用する「find」コマンドと合わせて利用されることが多いため、ぜひこれをきっかけに「cat」「find」コマンドの使い方についても同時期に学習することをおすすめします。またコマンドはせっかく覚えても実践しないと使い方を忘れてしまう可能性が高いため、LinuxOSの検証環境等を用意して、積極的に使用していきましょう。