ウェブサイト検索

Linuxにおけるsedコマンドの習得: 包括的ガイド


紹介

Linuxのsed(ストリームエディタ)コマンドは、テキスト操作のための強力なユーティリティです。ユーザーは、ファイル内のテキストを検索、置換、挿入、削除するなど、さまざまな操作を実行できます。このチュートリアルでは、実用的な例、構文の説明、高度な使用例を通じてsedコマンドをマスターするための包括的なガイドを提供します。

sedコマンドとは何ですか?

sedコマンドは、逐次的にテキストを処理するストリームエディタです。これにより、テキストエディタでファイルを直接開くことなく、ファイルの内容を修正することができます。シェルスクリプトやシステム管理で、テキスト処理のタスクを自動化するために広く使用されています。

sedの主な機能

1. パターンマッチングと置換 2. インプレースファイル編集 3. テキストフィルタリングと操作 4. 正規表現のサポート 5. マルチライン操作

sed コマンドの基本構文

sed コマンドの基本構文は、コマンドオプション、編集命令を定義するスクリプト、処理されるファイルの3つの主要な要素で構成されています。

この構造により、ユーザーはコマンドの動作を指定し、テキスト変換を定義し、それを目的のファイルに適用することができます。

  1. コマンドオプション: これはコマンドの動作を指定するために使用されます。例えば、-iオプションは、ファイルを上書きするためのインプレースファイル編集に使用されます。

  2. スクリプト:スクリプトは編集指示を定義します。これは、シングルクォート(')またはダブルクォート(")で囲むことができます。スクリプトには、1つ以上の編集コマンドを含むことができ、各コマンドはセミコロン(;)で区切られます。

  3. 入力ファイル: これは処理されるファイルです。単一のファイルまたはスペースで区切られたファイルのリストであることができます。ファイルが指定されていない場合、sedは標準入力から読み取ります。

sed コマンドの基本構文は次のとおりです。

sed [options] 'script' file

この文法では、sedがコマンドで、[options]がコマンドオプションで、'script'が編集コマンドを含み、fileが処理されるファイルです。

sed [options] 'script' file

以下の例を使うと、あなたはそれをより良く理解するでしょう。

sed 's/hello/world/' sample.txt

これは sample.txt の各行で最初の「hello」を「world」に置き換えます。

sedで一般的に使用されるオプション

オプション説明例
-i
インプレース編集
sed -i 's/old/new/' file.txt
-n
自動印刷を抑制する
sed -n '/pattern/p' file.txt
-e
複数のコマンドを実行する
sed -e 's/old/new/' -e '/pattern/d' file.txt
-f
ファイルからコマンドを読み取る
sed -f script.sed file.txt
-r
拡張正規表現を使用してください
sed -r 's/old/new/' file.txt
-E
拡張正規表現を使用します(-rに似ています)
sed -E 's/old/new/' file.txt
-z
NUL文字で行を区切る
sed -z 's/old/new/' file.txt
-l
「l」コマンドの行の長さを指定してください。
sed -l 100 'l' file.txt
-b
バイナリーモード(CR文字を削除しない)
sed -b 's/old/new/' file.txt

sedの最も一般的な使用例

以下は、sed コマンドの最も実用的な使用例のいくつかです。

まず、サンプルテキストファイル file1.txt を作成し、以下のテキストを書き込みます。理解しやすくするために、一緒に進めていきましょう。

cat > file1.txt

次のテキストをコピーして貼り付けてください:

Linux is a family of free and open-source operating systems based on the Linux kernel.
Operating systems based on Linux are known as Linux distributions or distros.
Examples include Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.

検索と置換

以下のコマンドでは、sは置換操作を指定し、/はデリミタです。/Linux/は検索パターンで、Unixは置換文字列です。

注意: デフォルトでは、sed コマンドは各行のパターンの最初の出現のみを置き換え、行内の2回目や3回目の出現を置き換えません。

sed 's/Linux/Unix/' file1.txt

このコマンドは、各行の最初の出現で「Linux」を「Unix」に置き換えます。

出力 :

Unix is a family of free and open-source operating systems based on the Linux kernel.
Operating systems based on Unix are known as Linux distributions or distros.
Examples include Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Unix, and many others.

各行でグローバルに置き換え

代替フラグ/g(グローバル置換)は、行内の文字列のすべての出現を置き換えるためのsedコマンドを指定します。

sed 's/Linux/Unix/g' file1.txt

このコマンドは各行の「Linux」を「Unix」に置き換えます。

出力 :

Unix is a family of free and open-source operating systems based on the Unix kernel.
Operating systems based on Unix are known as Unix distributions or distros.
Examples include Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Unix, and many others.

インプレース編集

その`-iは、ファイルのインプレース編集を可能にします。簡単に言えば、ファイルを上書きします。

sed -i 's/Linux/Unix/' file1.txt

このコマンドは、file1.txt内の「Linux」を「Unix」に直接置き換え、ファイルをその場で編集します。-iなしでは、挿入は出力のみに適用され、ファイルの内容は変更されません。変更を永続的にするには、-iオプションを使用する必要があります。

特定の行を削除する

sed '2d' file1.txt

このコマンドは file1.txt の2行目を削除します。

出力 :

Unix is a family of free and open-source operating systems based on the Linux kernel.
Examples include Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Unix, and many others.

特定の行を印刷する

-nはパターンスペースの自動印刷を抑制し、pは印刷コマンドです。

sed -n '1,2p' file1.txt

このコマンドはfile1.txtの1行目から2行目を出力します。

出力 :

Unix is a family of free and open-source operating systems based on the Unix kernel.
Operating systems based on Unix are known as Unix distributions or distros.

パターンに一致する行を削除する

/pattern/ はパターンを含む行と一致し、d フラグは一致した行を削除します。

sed '/kernel/d' file1.txt

このコマンドは「kernel」という単語を含むすべての行を削除します。

出力 :

Operating systems based on Unix are known as Unix distributions or distros.
Examples include Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Unix, and many others.

バックアップファイルで置き換える

以下のコマンドは、すべての「Unix」というインスタンスを「Linux」に置き換え、置き換え前の古いファイルの内容を持つバックアップファイルfile1.txt.bakを作成します。-i.bakは、インプレース編集を有効にし、バックアップファイルを作成します。

sed -i.bak 's/Unix/Linux/g' file1.txt

出力 :

Linux is a family of free and open-source operating systems based on the Linux kernel.
Operating systems based on Linux are known as Linux distributions or distros.
Examples include Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.

そして、こちらがバックアップファイルfile1.txt.bakのファイル内容です。

more file1.txt.bak
Unix is a family of free and open-source operating systems based on the Unix kernel.
Operating systems based on Unix are known as Unix distributions or distros.
Examples include Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Unix, and many others.

タブをスペースに置き換える

以下のコマンドは、各タブ文字を4つのスペースに置き換えます。\tフラグはタブ文字に一致し、/gフラグは行全体でのグローバル置換用です。

sed 's/\t/    /g' file1.txt

出力 :

   Linux is a family of free and open-source operating systems based on the Linux kernel.
Operating systems based on Linux are known as Linux distributions or distros.
Examples     include Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.

空行を削除する

以下のコマンドは file1.txt からすべての空行を削除します。 /^$ は空行に一致し、 /d フラグは一致した行を削除します。

sed '/^$/d' file1.txt

このコマンドをテストするために、vi テキストエディタを使用して file1.txt ファイルを編集し、いくつかの空行を追加できます。

パターンに一致する行を印刷する

以下のコマンドは「Ubuntu」を含む行のみを表示します。

sed -n '/Ubuntu/p' file1.txt

-n オプションは自動印刷を抑制します。 /Ubuntu/ はパターンを含む行に一致し、p は一致した行を印刷します。

出力 :

Example includes Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.

sedの高度な使用例

このセクションでは、sed コマンドのいくつかの高度でより複雑な使用例を紹介します。

行の前にテキストを挿入する

以下のコマンドは file1.txt の2行目の前に「これは挿入されたテキストです。」を挿入します。

sed -i '2i\This is inserted text.' file1.txt

コマンドの -i オプションはその場での編集用で、2i\ フラグは2行目の前にテキストを挿入します。

注意: -iを使用しない場合、挿入は出力のみで行われ、ファイルの内容は変更されません。変更を持続させるには、sedコマンドと共に-iオプションを使用する必要があります。

出力 :

Linux is a family of free and open-source operating systems based on the Linux kernel.
This is inserted text.
Operating systems based on Linux are known as Linux distributions or distros.
Example includes Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.

行内のパターンのn番目の出現を置き換えること

/1 または /2 フラグを使用して、行内のパターンの最初、2番目の出現を置き換えます。以下のコマンドは、行内の “Linux” という単語の2番目の出現を “Unix” に置き換えます。

sed 's/Linux/Unix/2' file1.txt

出力 :

Linux is a family of free and open-source operating systems based on the Unix kernel.
This is inserted text.
Operating systems based on Linux are known as Unix distributions or distros.
Examples includes Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.

行の後に文字列を追加する

以下のコマンドは、file1.txtの3行目の後に「このテキストは追加されました。」を追加します。-iオプションは変更が保存されることを保証し、3a\は指定された3行目の後にテキストを追加します。

sed -i '3a\This is appended text.' file1.txt

出力 :

Linux is a family of free and open-source operating systems based on the Linux kernel.
This is inserted text.
Operating systems based on Linux are known as Linux distributions or distros.
This is appended text.
Example includes Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.

行の先頭の文字列を置き換える

^<pattern> フラグは、行の先頭で特定のパターンと一致させるために使用されます。以下のコマンドは、「Linux」が行の先頭にある場合にのみ、「Linux」を「Unix」に置き換えます。

sed 's/^Linux/Unix/' file1.txt

出力 :

Unix is a family of free and open-source operating systems based on the Linux kernel.
This is inserted text.
Operating systems based on Linux are known as Linux distributions or distros.
This is appended text.
Example includes Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.

行の末尾の文字列を置き換える

以下のコマンドは、「distros.」を「distributions」に置き換えます。ただし、行の末尾に現れた場合のみです。<pattern>$ フラグは、特定のパターンを行の末尾に一致させるために使用されます。

sed 's/distros.$/distributions/' file1.txt

出力 :

Linux is a family of free and open-source operating systems based on the Linux kernel.
This is inserted text.
Operating systems based on Linux are known as Linux distributions or distributions.
This is appended text.
Example includes Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.

ケースに依存しない置換

以下のコマンドは「linux」を「Unix」に置き換え、大文字小文字を無視します。Iフラグは一致を大文字小文字を区別しないようにします。

sed 's/linux/Unix/I' file1.txt

パターン間の行を抽出する

以下のコマンドは、「挿入された」と「追加された」の間のすべての行を出力します(両方を含む)。

sed -n '/inserted/,/appended/p' file1.txt
  1. ,: 2つのパターンの間の行を一致させるための範囲演算子です。

  2. p: 一致した行を印刷します。

そして、自動的な行印刷を抑制するための-nオプションです。

出力 :

This is inserted text.
Operating systems based on Linux are known as Linux distributions or distros.
This is appended text.

複数のファイルを処理する

以下のコマンドは、file1.txt と file2.txt の両方で「Linux」を「Unix」に置き換え、ファイルを上書きします。

sed -i 's/Linux/Unix/' file1.txt file2.txt

フォーマットと非空行の番号

file1.txtの空でない行に行番号を追加するコマンドです。

sed '/./=' file1.txt | sed 'N;s/\n/ /'
  1. /./=: 空でない行にマッチし、それに番号を付けます。

  2. N: パターンスペースに次の行を追加します。

  3. s// /: 改行文字をスペースに置き換えます。

出力 :

1 Linux is a family of free and open-source operating systems based on the Linux kernel.
2 This is inserted text.
3 Operating systems based on Linux are known as Linux distributions or distros.
4 This is appended text.
5 Example includes Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.

特定の行番号で文字列を置き換える

特定の行番号で文字列を置き換えるために、sedコマンドを制限することができます。以下のコマンドは、3行目のみで文字列「distros」を「distributions」に置き換えます。

sed '3 s/distros/distributions/' file1.txt

出力 :

Linux is a family of free and open-source operating systems based on the Linux kernel.
This is inserted text.
Operating systems based on Linux are known as Linux distributions or distributions.
This is appended text.
Example includes Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.

行の範囲内で文字列を置き換える

文字列を置き換えるために、sedコマンドに行番号の範囲を指定することもできます。以下のコマンドは、行1から3の間の最初の「Linux」の出現を「Unix」に置き換えます。

sed '1,3 s/Linux/Unix/' file1.txt

出力 :

Unix is a family of free and open-source operating systems based on the Linux kernel.
This is inserted text.
Operating systems based on Unix are known as Linux distributions or distros.
This is appended text.
Example includes Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.

大きなファイルに対するパフォーマンスの考慮事項

大きなファイルをsedで処理することは、特に多くの操作や非常に大きなデータセットを扱う場合、リソースを多く消費することがあります。ここでは、パフォーマンスを最適化し、sedコマンドの効率的な使用を確保するためのいくつかのヒントを紹介します:

1.不必要な出力を最小化するには-nを使用してください - -nオプションは各行の自動印刷を抑制し、必要な出力だけが表示されるようにします。これにより、大きなファイルを扱う際のオーバーヘッドが減少します。

例 :

sed -n '/pattern/p' largefile.txt

2.スクリプトの簡素化 - 1つのコマンドでの操作の数を最小限に抑えます。例えば、複数のsedコマンドを順次適用するのではなく、それらを単一のスクリプトに統合してファイルの読み込みを減らします。

例 :

sed -e 's/foo/bar/' -e '/pattern/d' largefile.txt

3.パイプを使ったストリーム入力: - 他のコマンドやストリームからデータを処理する際は、中間ファイルの作成を避け、ディスクI/Oを減らすためにパイプを使用してください。

例 :

cat largefile.txt | sed 's/foo/bar/' > output.txt

4.大きなファイルでのインプレース編集を避ける - 大きなファイルを直接修正するのではなく、新しいファイルに出力を書き込み、正しさを確認した後に元のファイルを置き換えます。

例 :

sed 's/old/new/' largefile.txt > temp.txt && mv temp.txt largefile.txt

5.ベンチマークの代替手段 - 非常に大きなファイルの場合は、特定のタスクに対してより良いパフォーマンスを提供する可能性のあるawk、perl、またはgrepのようなツールの使用を検討してください。

例 :

awk '{gsub(/old/, "new"); print}' largefile.txt > output.txt

LinuxにおけるAWKコマンドに関するこれらのチュートリアルや、Linuxでのテキスト操作にAWK言語を使用する方法を参照して、Linuxでのawkコマンドの使用方法についてもっと学ぶことができます。

シェルスクリプトとの統合

sed コマンドはシェルスクリプトで一般的に使用され、繰り返しのテキスト操作タスクを自動化します。以下はその例です:

#!/bin/bash
Replace all occurrences of "foo" with "bar" in input.txt and save the result
sed 's/foo/bar/g' input.txt > output.txt

input.txtを処理し、修正された出力をoutput.txtに書き込みます。

sed と他の代替手段

基本的なテキスト処理において、sedは効果的で軽量なツールですが、awkやperlのような現代的な代替手段は追加機能を提供し、特定のタスクに適しています。以下は、主要な違いの概要とそれぞれを使用する際のタイミングです。

sedの使用方法

  • 迅速でシンプルなテキストの置換または削除。
  • ファイル内の行ベースの変換。
  • スクリプトのオーバーヘッドが最小限で済むタスク。

awkの使用方法

  • CSVやTSVファイルのような構造化データの取り扱い。
  • テキスト処理と並行して算術計算を行う。
  • 入力データからフォーマットされたレポートを生成しています。

例 :

awk -F, '{print $1, $3}' data.csv

これはCSVファイルから最初と三番目のフィールドを抽出して表示します。

perlを使用する時

  • 高度な正規表現を用いた複雑なテキスト操作。
  • テキスト処理と論理または条件を組み合わせること。
  • コンパクトでありながら強力なスクリプトを書くこと。

例 :

perl -pe 's/(error)/WARNING: $1/' logfile.txt

これにより、“error”という単語を含む行に“WARNING: ”という接頭辞が追加されます。

結論

sed コマンドを習得することで、Linuxでテキストを効率的に操作・処理する能力が向上します。その強力な機能とスクリプトへのシームレスな統合は、テキストベースの操作タスクにおいて貴重なツールです。

次のステップ

基本的なsedを習得した後は、より高度な技術や使用例を学ぶことができます。以下の一連のチュートリアルを使用して、sedおよび関連トピックについて学ぶことで、理解を深め、テキスト処理スキルを向上させることができます:

  • Linuxでテキストを操作するためのsedストリームエディタの基本
  • 中級 sed: Linux環境におけるテキストのストリーム操作

これらのチュートリアルは、基本的なsed操作から、より複雑なテキスト操作技術まで、さまざまなトピックをカバーしています。コマンドラインでのテキスト処理に習熟したい人にとって、貴重なリソースです。

よくある質問

Linuxのsedコマンドとは何ですか?

Linuxのsed(ストリームエディタ)コマンドは、入力ストリーム(ファイルまたはパイプラインからの入力)に対して基本的なテキスト変換を行うための強力なテキスト処理ツールです。テキストの検索、置換、削除、および挿入を行うことができるため、テキスト操作タスクの自動化に非常に便利です。

sedをいつ使用しますか?

sedは次のシナリオで使用できます:

  • テキスト置換: ファイルやストリーム内の単語、フレーズ、またはパターンを置き換えます。
  • テキスト削除: 特定の行やパターンを削除します。
  • インプレース編集: テキストエディタを開くことなく、ファイルを直接修正します。
  • バッチ処理: スクリプトを使用して複数のファイルに同じ操作を実行します。
  • テキスト挿入/抽出: 設定ファイルやログなどの構造化ファイルに特定のテキストを挿入または抽出します。

sedを適切に使う方法は?

sedを効果的に使用するには、次の手順に従ってください:

sed [options] 'command' file
  • コマンド: sed 操作 (例: s は置換、d は削除を意味する)。
  • ファイル: 処理する対象ファイル。

適用する前にテスト: まず、ファイルを直接変更する前に出力を確認するために、-iオプションなしでコマンドを実行します。

正規表現を使用する:sedの正規表現へのサポートを活用して、複雑なパターンを一致させたり操作したりします。

複数のコマンドを連鎖させる: ; または -e を使用して、単一の操作で複数の sed コマンドを実行します。

sedを使ってテキストを置き換える方法は?

テキストを置き換えるには、この構文を使用して s コマンドを使用します:

sed 's/old_text/new_text/' file

例:

  • 各行の最初の「foo」を「bar」に置き換えてください:
sed 's/foo/bar/' file.txt
  • すべての「foo」を「bar」にグローバルに置き換えます:
sed 's/foo/bar/g' file.txt
  • インプレース置き換え(ファイルを直接変更する):
sed -i 's/foo/bar/g' file.txt

sed コマンドをどのように実行しますか?

ターミナルからこの基本構文を使用して直接 sed コマンドを実行できます。

sed 'command' filename

例 :

「error」という単語を含む行を印刷し、log.txtというファイル内の「error」を「warning」に置き換えるには:

sed 's/error/warning/' log.txt

Linuxにおけるgrepコマンドとsedコマンドの違いは何ですか?

機能グレップセド
目的1つまたは複数のファイル内のパターンを検索するテキストのストリームを編集する
出力パターンを含む行を印刷します編集されたテキストを印刷します
行動検索, フィルター検索、置換、挿入、削除
使用
grep pattern file
sed 'command' file
検索と置換はい(制限あり)はい
インプレース編集いいえはい
正規表現はいはい
複数行操作いいえはい
テキストフィルタリングいいえはい
一般的な使用例ログを検索し、テキストのパターンを見つける設定ファイルの編集、複数のファイルのテキストの置換

例 :

  • log.txt で「error」を検索するには grep を使用します:
grep 'error' log.txt
  • log.txt内の「error」を「warning」に置き換えるためにsedを使用します:
sed 's/error/warning/g' log.txt

sedを使って空行を削除する方法は?

ファイルから空行を削除するには、次のsedコマンドを使用します:

sed '/^$/d' file.txt

説明:

  • ^$: 空の行(文字がない行)に一致します。
  • d: 一致した行を削除します。

例 :

コマンドを実行する前に、ファイルはこのように見えるかもしれません:

line 1

line 2

line 3

コマンドを実行した後:

sed '/^$/d' file.txt

出力は次の通りです:

line 1
line 2
line 3

関連記事: