別の方法でテキストの編集操作を行っているのを探していましたか?もう探す必要はありません!このチュートリアルでは、ストリームエディターsedの例を提供しています。
要するに、sedを使用すると、ファイルやテキストストリームに対して幅広い編集を対話形式で行うことなく行うことができます。コマンドを呼び出す際に編集の決定を行います。そしてこのチュートリアルでは、sedコマンドの使用方法を学び、効率的にワークフローを整理する方法を身につけます。
続けて読んで、コマンドラインスキルを向上させましょう!
前提条件
このチュートリアルの実演に追従するために、以下のものが必要です:
- A command line interface (e.g., Terminal on macOS or Linux) – This tutorial uses Ubuntu Linux 20.04, but the commands should work on most popular operating systems.
- A text editor (e.g., nano, vi, or Sublime Text) – This tutorial uses Nano.
Ubuntuにsedをインストールする
sedは、LinuxやmacOSを含むほとんどのUnix系オペレーティングシステムに標準のユーティリティとして含まれています。しかし、sedがすでにシステムにインストールされているかどうかを再確認することは、テキスト変換を実行する前の基本的な手順であり、問題ありません。
1. ターミナルを開き、以下のsed
コマンドを実行して、システムにインストールされているsedのバージョンを確認します。
sedがインストールされている場合、以下のようにsedのバージョン番号とビルドに関する情報が表示されます。

それ以外の場合、`sed`がインストールされていない場合は、以下のエラーメッセージが表示されます。

このエラーメッセージは、システムのPATH環境変数に`sed`コマンドが見つからなかったことを示しています。
次に、以下のコマンドを実行して、システムに`sed`を更新およびインストールしてください。[apt-get update]このコマンドは、構成されたパッケージソースから最新のパッケージ情報、パッケージの依存関係、ファイル、およびスクリプトを取得します。このコマンドを実行することは、`sed`の最新バージョンおよび必要な他のパッケージをインストールするために必要です。

最後に、以下のコマンドを実行して`sed`コマンドがシステムにインストールされているか確認してください。
このコマンドは、この例では`/usr/bin/sed`のように`sed`実行可能ファイルの完全なパスを表示します。
一旦`sed`がインストールされ、PATHに追加されたことを確認したら、sed
コマンドを使用してさまざまなテキスト変換と操作を行うことができます。

テキストファイル内の文字列の置換
`sed`は、ほとんどのUnixライクなオペレーティングシステムで利用可能な人気のあるストリームエディタであり、その中でも`sed`の最も便利な機能の1つは、テキストファイル内の文字列を置換することです。
以下は、文字列を置換するのに役立ついくつかのシナリオですが、これに限らず様々な場面で活用できます。
- 新しいドメイン名を反映させるためにURLのリストを更新します。
- データベースまたはCSVファイル内の製品IDを変更します。
- 別のシステムにインポートするためのデータをフォーマットし、その他多くの操作を行います。
sedの基本的な構文は次のとおりです:
Placeholder | Function |
---|---|
command | Controls sed’s behavior. |
options | Allows you to customize the behavior of the sed command |
input_file | Specifies the file or text stream that you want to edit. Typically, you can specify a single file or stream, but concatenating multiple files or streams by redirection also works. |
output_file | Specifies the file that contains the results of your sed command. The file can be new or the same as input_file, depending on how you use sed. |
テキストファイル「urls.txt」があり、すべてのURLを新しいドメイン名を使用するように更新したいとします。
1. 以下のecho
コマンドを実行して、現在のディレクトリにurls.txt
ファイルを作成します。これらのコマンドは出力を提供しませんが、指定されたテキストをファイルに書き込みます。
2. 次に、cat
コマンドを実行してurls.txtファイルの内容を表示します。cat urls.txt
以下の出力は、urls.txtファイルに書かれた3つの古いURLを確認しています。

3. 以下のコマンドを実行して、urls.txt
ファイル内の文字列old-domain.com
のすべての出現箇所をnew-domain.com
に置き換えます。
入力ファイルのURLが新しいドメインで更新されたことが確認できます。

文字列のN番目の出現箇所の置換
基本的な検索と置換機能に加えて、sedにはテキストのより複雑な変換を行うための追加の組み込みコマンドがあります。その一例として、テキストの単一行内でパターン文字列のN番目の出現箇所を置き換えることがあります。
たとえば、CSVファイルの2番目のフィールドを新しい値に更新したり、データベースのダンプ内の文字列の3番目の出現箇所を更新したりしたい場合があります。
このコマンドの基本的な構文は次のとおりです:
pattern
– 置換する文字列。replacement
– 置換に使用する文字列。n
– is the nth occurrence of the string to replace (e.g.,1
=first occurrence,2
=second occurrence…).
特定の文字列のn番目の出現を置換する方法を見るには、次の手順に従います:
次のecho
コマンドを実行して、quick
パターンが3回出現するテキスト行を作成します。次に、sed
コマンドがパターンquick
の2番目の出現(2
)を文字列fast
で置換します。
以下のように、パターンquickの2番目の出現のみが文字列fastで置換され、他のすべての出現は変更されません。
nth
コマンドはデフォルトで大文字と小文字を区別します。そのため、コマンドはパターンの完全一致を検索します。パターンの大文字と小文字を無視するには、次の手順に進んでください。

?
nth
コマンドは、パターンの出現を左から右に数えます。さらに、nth
コマンドは、1行のテキストにのみ対応しています。複数行で置換を行うには、次のセクションで示されている異なる方法を使用します。
次に、以下のコマンドを実行して、パターンquick
の2番目(2
)の出現をfast
で置換し、文字列の大文字と小文字を無視します(i
)。
i
オプションは、一貫性のない大文字と小文字のテキストを扱う際に便利です。
以下の出力では、単語「quick」の2番目の出現箇所(QuiCk)が大文字小文字を区別せずに文字列fastで置換されています。

一致するパターン/文字列のすべての出現を置換する
文字列のn番目の出現を置換する代わりに、すべての出現を置換することが計画されているかもしれません。これにより、例えば著作権文字列のすべての出現を現在の年に置換する計画に大きく役立ちます。
1.お好みのテキストエディタで、次の内容を持つinput.txtという名前のファイルを作成します。
This is a quick test.
The quick brown fox jumps over the lazy dog.
Quick, you need to finish this task before it gets too late.
2.次に、以下のコマンドを実行して、input.txt
ファイルから単語quick
のすべての出現をfast
に置換します。置換された後、変更内容はoutput.txt
ファイルに書き込まれます。
3.次に、以下のコマンドを実行してoutput.txt
ファイルの内容を表示し、置換が行われたかどうかを確認します。
以下のように、単語quickのすべての出現がfastに置換されていることがわかります。 nth
コマンドと同様に、g
コマンドは大文字小文字を区別し、完全一致のみを置換します。
Quick文字列は置換されませんが、i
オプションを使用して大文字小文字を区別しない置換を行うことができます。

特定の行で一致するパターン文字列を置換
おそらく、置換する文字列が含まれる行が既にわかっているかもしれません。特定の行に文字列を置換することができるなら、すべての出現箇所を置換する必要はありません。この機能は、ファイルやストリームの特定の行に変更を加える際に役立ちます。
以下は、特定の行から文字列を置換するための構文です。ここで、n
は行番号を表します。
1. 以下の内容を持つmyfile.txtという名前のファイルを作成します。
test1
test2
test3
2. 次に、以下のsed
コマンドを実行して、以下の操作を行います。
myfile.txt
ファイルの2行目(2
)から単語test2
を検索します。s
コマンドで単語test2
をtest2_changed
に置換します。>
で変更内容をmyfile_changed.txt
という新しいファイルに書き込みます。
This command does not provide output to the terminal since the changes are written to a new file. But you will verify the changes in the following step.
3. 最後に、以下のcatコマンドを実行して、myfile_changed.txt
ファイルの内容を表示します。
以下のように、myfile.txtファイルの2行目がtest2_changedに置換されていることがわかりますが、他の行は変更されていません。

変更された行のみを出力する
変更を加えた後、ファイル全体を出力するのではなく、変更された行のみを出力したい場合があります。どのようにすればよいでしょうか?p
フラグと-n
オプションを併用することで実現できます。
以下は、変更された行のみを排他的に表示するための構文です。ここで、
-n
オプションは、sed
がデフォルトの挙動であるすべての行を出力しないようにするためのものです。p
フラグは、sed
にコマンドの出力をプリントするように指示します。
myfile.txtファイルを開き、以下の内容で置き換えてください。2行目が誤っていますが、first
という単語はsecond
に置き換える必要があります。
This is the first line of my file.
This is the first line of my file.
This is the third line of my file.
次に、以下のsed
コマンドを実行して、myfile.txt
の2行目(2
)にある文字列first
をsecond
に置き換えますが、変更された行のみを出力します(p
)。
以下のように、ターミナルに変更された2行目の出力が表示されます。

結論
このチュートリアルでは、さまざまなsedの使用例を使用して検索と置換の操作を実行しました。さらに、特定の出現回数を置換したり、変更された行のみを出力するなど、より高度な技術に触れました。
sedは、さまざまなテキスト操作タスクを実行できる強力なコマンドラインツールです。ファイル全体でのグローバルな置換や特定の行でのターゲットされた置換を行う場合でも、sedが役立ちます。
さて、正規表現についてさらに詳しく調べてみませんか?正規表現は、sedを含む多くのテキスト操作ツールに必須です。これらの表現は時間の節約になり、努力を軽減します。いつ?大量のテキストで複雑な検索と置換操作を実行するときです。