ウェブサイト検索

Linux sed コマンドを使用してファイル編集を自動化する方法


ここでは、Linux コマンド ラインからのファイル編集を自動化するためのヒントとテクニックをいくつか紹介します。

Linux コマンド ラインを使用するときは、デスクトップ コンピューターで新しいプログラムを作成する場合でも、Web サーバーで Web サイトを管理する場合でも、テキスト ファイルを処理する必要があることがよくあります。 Linux には、仕事を遂行するために活用できる強力なツールが用意されています。私は、パターンに従ってテキストを変更できるエディターである sed を頻繁に使用します。

sedストリーム エディタの略で、ファイル内のテキストを編集し、結果を出力します。 sed を使用する 1 つの方法は、ファイル内の 1 つの文字列の複数の出現を識別し、それらを別の文字列に置き換えることです。 sed を使用すると、テキスト ファイルを無限に処理できますが、ファイル管理に役立つ sed の使用方法をいくつか共有したいと思います。

Linux 上のファイル内のテキストを検索および置換する

sed を使用するには、正規表現を使用する必要があります。正規表現は、パターンを定義する一連の特殊文字です。 sed を使用する最も頻繁な例は、ファイル内のテキストを置換することです。テキストを置換するための構文は、s/originaltext/newtext/ のようになります。 s は、テキスト置換を実行するか、テキストの出現を交換するように sed に指示します。元のテキストと新しいテキストをスラッシュの間に入力します。

この構文は、各行で最初に出現した originaltext のみを置き換えます。元のテキストが 1 行に複数回出現する場合でも、すべての出現箇所を置換するには、式の末尾に g を追加します。以下に例を示します: s/originaltext/newtext/g

これを sed で使用するには、-e オプションでこの正規表現を指定します。

$ sed -e 's/originaltext/newtext/g'

たとえば、Conway のライフ ゲームをシミュレートするゲーム というプログラムの Makefile があるとします。

.PHONY: all run clean

all: game

game: game.o
	$(CC) $(CFLAGS) -o game game.o $(LDFLAGS)

run: game
	./game

clean:
	$(RM) *~
	$(RM) *.o
	$(RM) game

ゲームという名前はあまり説明的ではないので、 名前をライフに変更することを選択するかもしれません。 game.c ソース ファイルの名前を life.c に変更するのは簡単ですが、新しい名前を使用するように Makefile を変更する必要があります。 sed を使用すると、あらゆるゲームライフに変更できます。

$ sed -e 's/game/life/g' Makefile
.PHONY: all run clean

all: life

life: life.o
	$(CC) $(CFLAGS) -o life life.o $(LDFLAGS)

run: life
	./life

clean:
	$(RM) *~
	$(RM) *.o
	$(RM) life

これにより、sed 出力が画面に出力されます。これは、テキストの置換によって希望どおりの結果が得られるかどうかを確認する良い方法です。 Makefile にこれらの変更を加えるには、まずファイルのバックアップを作成し、次に sed を実行して出力を元のファイル名で保存します。

$ cp Makefile Makefile.old
$ sed -e 's/game/life/g' Makefile.old > Makefile

変更が希望通りであると確信できる場合は、-i または --in-place オプションを使用してファイルをその場で編集します。ただし、後で復元する必要がある場合に備えて、元のファイルのコピーを保存するために、--in-place=.old のようなバックアップ ファイル名サフィックスを追加することをお勧めします。次のようになります。

$ sed --in-place=.old -e 's/game/life/g' Makefile
$ ls Makefile*
Makefile  Makefile.old

Linux で sed を使用してファイルを引用する

正規表現の他の機能を使用して、テキストの特定のインスタンスと一致させることができます。たとえば、行の先頭にあるテキストを置換する必要がある場合があります。 sed を使用すると、行の先頭をキャレット文字である ^ と一致させることができます。

テキストを置換する際に「行頭」を使用する方法の 1 つは、電子メールでファイルを引用する必要がある場合です。 Makefile を電子メールで共有したいが、添付ファイルとして含めたくないとしましょう。代わりに、各行の前に > を使用して、電子メールの本文でファイルを「引用」することを好みます。次の sed コマンドを使用して、編集したバージョンを端末に出力し、コピーして新しいメールに貼り付けることができます。

$ sed -e 's/^/>/' Makefile
>.PHONY: all run clean
>
>all: life
>
>life: life.o
>	$(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
>
>run: life
>	./life
>
>clean:
>	$(RM) *~
>	$(RM) *.o
>	$(RM) life

s/^/>/ 正規表現は、各行の先頭 (^) と一致し、そこに > を配置します。事実上、これにより各行が > 記号で始まります。

タブは電子メールでは正しく表示されない可能性がありますが、別の正規表現を追加することで、Makefile 内のすべてのタブをいくつかのスペースに置き換えることができます。

$ sed -e 's/^/>/' -e 's/\t/  /g' Makefile
>.PHONY: all run clean
>
>all: life
>
>life: life.o
>  $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
>
>run: life
>  ./life
>
>clean:
>  $(RM) *~
>  $(RM) *.o
>  $(RM) life

\t はリテラル タブを示すため、s/\t/ /g は、入力内のすべてのタブを出力内の 2 つのスペースに置き換えるよう sed に指示します。

ファイルに多くの編集を適用する必要がある場合は、-e コマンドをファイルに保存し、-f を使用して sed に次のことを指示できます。そのファイルを「スクリプト」として使用します。この方法は、同じ編集を頻繁に行う必要がある場合に特に便利です。 quotemail.sed というスクリプト ファイルを使用して、電子メールで引用するための Makefile を準備したとします。

$ cat quotemail.sed
s/^/>/
s/\t/  /g
$ sed -f quotemail.sed Makefile
>.PHONY: all run clean
>
>all: life
>
>life: life.o
>  $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
>
>run: life
>  ./life
>
>clean:
>  $(RM) *~
>  $(RM) *.o
>  $(RM) life

Linux での sed の使い方を学ぶ

sed は、Linux コマンドライン ツールキットに入れておくと便利なツールです。 sed マニュアル ページを参照して、その使用方法について詳しく学習してください。コマンド ラインで「man sed」と入力すると、さまざまなコマンド ライン オプションと、sed を使用してテキスト ファイルを処理する方法に関する完全なドキュメントが表示されます。

関連記事: