Linux のストリームエディティング

LinuxLinuxBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Linux のストリームエディティングの実験へようこそ。この実験では、テキストの解析と変換に強力なコマンドラインユーティリティである sed (ストリームエディタ) の使い方を学びます。sed は、入力ストリーム (ファイルまたはパイプラインからの入力) に対して基本的なテキスト変換を行うために使用されます。

この実験の終了時には、以下のことができるようになります。

  • sed を使用して基本的なテキスト置換を行う
  • sed を使用してファイルを直接編集する
  • ファイル全体にわたってグローバル置換を適用する
  • 高度なテキスト処理技術を使用する

学んだスキルは、ファイルやテキストストリームを効率的に操作するのに役立ち、Linux での様々なシステム管理やテキスト処理タスクに不可欠です。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/TextProcessingGroup -.-> linux/sed("Stream Editing") subgraph Lab Skills linux/echo -.-> lab-271375{{"Linux のストリームエディティング"}} linux/cat -.-> lab-271375{{"Linux のストリームエディティング"}} linux/sed -.-> lab-271375{{"Linux のストリームエディティング"}} end

基本的な sed の使い方とテキスト置換

このステップでは、sed の基本と簡単なテキスト置換の方法を学びます。sed コマンドは強力なテキスト処理ツールで、エディタでファイルを開かずに、ファイル内のテキストを検索、置換、挿入、削除することができます。

まず、以下のコマンドを実行して、sed がシステムにインストールされていることを確認しましょう。

which sed

次のような出力が表示されるはずです。

/usr/bin/sed

これにより、sed が利用可能であることが確認できます。何らかの理由でインストールされていない場合は、以下のコマンドでインストールできます。

sudo apt-get update
sudo apt-get install -y sed

では、作業用のテキストファイルを作成しましょう。現在のディレクトリに sample.txt という名前のファイルを作成します。

echo "Linux is a powerful operating system." > ~/project/sample.txt
echo "Many users prefer Linux for servers." >> ~/project/sample.txt
echo "Linux has strong security features." >> ~/project/sample.txt

新しく作成したファイルの内容を確認しましょう。

cat ~/project/sample.txt

次のように表示されるはずです。

Linux is a powerful operating system.
Many users prefer Linux for servers.
Linux has strong security features.

では、sed を使って基本的な置換を行いましょう。以下のコマンドは、各行で最初に出現する "Linux" を "Ubuntu" に置き換えます。

sed 's/Linux/Ubuntu/' ~/project/sample.txt

次のように表示されるはずです。

Ubuntu is a powerful operating system.
Many users prefer Ubuntu for servers.
Ubuntu has strong security features.

sed は変更後のテキストを標準出力 (ターミナル) に出力しましたが、元のファイルは変更されていないことに注意してください。これを確認するには、以下のコマンドを実行します。

cat ~/project/sample.txt

出力には依然として "Linux" が表示され、"Ubuntu" は表示されないはずです。

Linux is a powerful operating system.
Many users prefer Linux for servers.
Linux has strong security features.

sed の置換の基本的な構文は次の通りです。

sed 's/pattern/replacement/' filename

ここで、

  • s は置換コマンドです。
  • pattern は置き換えたいテキストです。
  • replacement は新しいテキストです。
  • filename は入力ファイルです。

もう 1 つの例を試してみましょう。今度は、"powerful" を "versatile" に置き換えます。

sed 's/powerful/versatile/' ~/project/sample.txt

これにより、次のように出力されるはずです。

Linux is a versatile operating system.
Many users prefer Linux for servers.
Linux has strong security features.

直接編集とグローバル置換

前のステップでは、基本的なテキスト置換に sed を使う方法を学びましたが、変更は画面上にのみ表示され、ファイルに保存されませんでした。このステップでは、以下のことを学びます。

  1. -i オプションを使ってファイルを直接編集する
  2. g フラグを使ってグローバル置換を行う

直接編集

sed を使ってファイルに永続的な変更を加えるには、-i オプションを使用します。このオプションを使うと、出力をターミナルに表示するだけでなく、ファイル自体を直接変更します。

sample.txt ファイルを変更して、"Linux" を "Ubuntu" に置き換えましょう。

sed -i 's/Linux/Ubuntu/' ~/project/sample.txt

前のステップとは異なり、このコマンドは目に見える出力を生成しません。ファイルの内容が変更されたかどうかを確認しましょう。

cat ~/project/sample.txt

以下のように表示されるはずです。

Ubuntu is a powerful operating system.
Many users prefer Ubuntu for servers.
Ubuntu has strong security features.

変更がファイルに保存されました!これが sed による直接編集の威力です。

グローバル置換

デフォルトでは、sed は各行で最初に出現するパターンのみを置き換えます。すべての出現箇所を置き換えるには、置換コマンドの最後に g (グローバル) フラグを使用します。

繰り返しのテキストを含む新しいファイルを作成しましょう。

echo "The red car stopped at the red light near the red building." > ~/project/colors.txt

では、グローバルフラグを使用せずに sed を使って、"red" を "blue" に置き換えましょう。

sed 's/red/blue/' ~/project/colors.txt

以下のように表示されるはずです。

The blue car stopped at the red light near the red building.

"red" の最初の出現箇所のみが "blue" に置き換えられたことに注意してください。では、グローバルフラグを使用してみましょう。

sed 's/red/blue/g' ~/project/colors.txt

出力は以下のようになるはずです。

The blue car stopped at the blue light near the blue building.

"red" のすべての出現箇所が "blue" に置き換えられました!

これを sample.txt ファイルに適用しましょう。まず、"Ubuntu" をもう少し追加します。

echo "Ubuntu is great. I use Ubuntu daily for my work with Ubuntu tools." >> ~/project/sample.txt

では、グローバルフラグと直接編集を使って、"Ubuntu" のすべての出現箇所を "Linux" に置き換えましょう。

sed -i 's/Ubuntu/Linux/g' ~/project/sample.txt

変更を確認しましょう。

cat ~/project/sample.txt

以下のように表示されるはずです。

Linux is a powerful operating system.
Many users prefer Linux for servers.
Linux has strong security features.
Linux is great. I use Linux daily for my work with Linux tools.

ファイル全体で "Ubuntu" のすべての出現箇所が "Linux" に置き換えられました。

直接編集前にバックアップを作成する

直接編集を行う際には、元のファイルのバックアップを作成するのが良い習慣です。これは -i オプションに拡張子を指定することで行えます。

sed -i.bak 's/Linux/Ubuntu/g' ~/project/sample.txt

このコマンドは以下のことを行います。

  1. sample.txt のバックアップを sample.txt.bak として作成する
  2. sample.txt 内の "Linux" のすべての出現箇所を "Ubuntu" に置き換える

両方のファイルを確認しましょう。

cat ~/project/sample.txt
cat ~/project/sample.txt.bak

最初のコマンドでは "Linux" がすべて "Ubuntu" に置き換えられた状態が表示され、バックアップファイルには依然として "Linux" が含まれているはずです。

高度な sed コマンドとパターンマッチング

これまでに sed を使った基本的な置換と直接編集をマスターしました。では、もう少し高度な機能を探ってみましょう。

  1. 異なる区切り文字を使用する
  2. アドレス範囲を使用して特定の行を対象にする
  3. 複数のコマンドを組み合わせる

異なる区切り文字を使用する

これまで置換コマンドではスラッシュ / を区切り文字として使用してきましたが、sed では任意の文字を区切り文字として使用できます。これは、パターンや置換テキストにスラッシュが含まれる場合に特に便利です。

ファイルパスを含むファイルを作成しましょう。

echo "/usr/local/bin is in the PATH" > ~/project/paths.txt
echo "My config is in /etc/myapp/config.json" >> ~/project/paths.txt

/usr/local/bin/opt/bin に置き換えたい場合、スラッシュを使用すると混乱する可能性があります。

sed 's/\/usr\/local\/bin/\/opt\/bin/' ~/project/paths.txt

その代わりに、# などの異なる区切り文字を使用することができます。

sed 's#/usr/local/bin#/opt/bin#' ~/project/paths.txt

これははるかに読みやすくなります!出力は以下のようになるはずです。

/opt/bin is in the PATH
My config is in /etc/myapp/config.json

他の一般的な区切り文字には、|:_ などがあります。

アドレッシング - 特定の行を対象にする

sed では、置換を適用する行を指定することができます。これは、コマンドの前にアドレスを付けることで行います。

行番号付きの新しいファイルを作成しましょう。

echo "Line 1: This is the first line." > ~/project/numbered.txt
echo "Line 2: This is the second line." >> ~/project/numbered.txt
echo "Line 3: This is the third line." >> ~/project/numbered.txt
echo "Line 4: This is the fourth line." >> ~/project/numbered.txt
echo "Line 5: This is the fifth line." >> ~/project/numbered.txt

3 行目の "line" を "row" に置き換えるには、次のようにします。

sed '3 s/line/row/' ~/project/numbered.txt

出力は以下のようになるはずです。

Line 1: This is the first line.
Line 2: This is the second line.
Line 3: This is the third row.
Line 4: This is the fourth line.
Line 5: This is the fifth line.

行の範囲を指定することもできます。2 行目から 4 行目の "line" を "row" に置き換えるには、次のようにします。

sed '2,4 s/line/row/' ~/project/numbered.txt

出力は以下のようになるはずです。

Line 1: This is the first line.
Line 2: This is the second row.
Line 3: This is the third row.
Line 4: This is the fourth row.
Line 5: This is the fifth line.

もう 1 つの便利な機能は、パターンに基づいて行をマッチさせることができることです。たとえば、"third" または "fourth" を含む行のみで "line" を "row" に置き換えるには、次のようにします。

sed '/\(third\|fourth\)/ s/line/row/' ~/project/numbered.txt

出力は以下のようになるはずです。

Line 1: This is the first line.
Line 2: This is the second line.
Line 3: This is the third row.
Line 4: This is the fourth row.
Line 5: This is the fifth line.

複数のコマンドを組み合わせる

-e オプションを使用するか、コマンドをセミコロンで区切ることで、複数の sed コマンドを組み合わせることができます。

1 つのコマンドで "first" を "1st"、"second" を "2nd"、"third" を "3rd" に置き換えましょう。

sed -e 's/first/1st/' -e 's/second/2nd/' -e 's/third/3rd/' ~/project/numbered.txt

あるいは、セミコロンを使用することもできます。

sed 's/first/1st/; s/second/2nd/; s/third/3rd/' ~/project/numbered.txt

どちらのコマンドも同じ出力を生成するはずです。

Line 1: This is the 1st line.
Line 2: This is the 2nd line.
Line 3: This is the 3rd line.
Line 4: This is the fourth line.
Line 5: This is the fifth line.

では、これらの変更を永続的にするために、次のようにします。

sed -i 's/first/1st/; s/second/2nd/; s/third/3rd/' ~/project/numbered.txt

そして、変更を確認します。

cat ~/project/numbered.txt

序数が更新されたテキストが表示されるはずです。

sed スクリプトの使用

前のステップでは、コマンドラインから直接 sed コマンドを実行してきました。しかし、より複雑な操作の場合は、sed スクリプトファイルを作成する方が便利なことが多いです。これにより、以下のことが可能になります。

  1. 複数の sed コマンドを整理する
  2. 各コマンドの機能を説明するコメントを追加する
  3. 異なるファイルに同じ操作を再利用する

sed スクリプトの作成

いくつかのテキスト変換を行う簡単な sed スクリプトを作成しましょう。

cat > ~/project/transform.sed << 'EOF'
## Replace "Linux" with "Ubuntu"
s/Linux/Ubuntu/g

## Replace "user" with "developer"
s/user/developer/g

## Replace "system" with "platform"
s/system/platform/g

## Convert "is" to uppercase
s/is/IS/g
EOF

このスクリプトは 4 つの置換を行います。

  1. "Linux" のすべての出現箇所を "Ubuntu" に置き換える
  2. "user" のすべての出現箇所を "developer" に置き換える
  3. "system" のすべての出現箇所を "platform" に置き換える
  4. "is" のすべての出現箇所を大文字の "IS" に変換する

スクリプトをテストするための新しいファイルを作成しましょう。

cat > ~/project/test.txt << 'EOF'
Linux is a powerful operating system.
The user interface is very customizable.
Many Linux users prefer the command-line interface.
The system resources are efficiently managed.
EOF

sed スクリプトの実行

テストファイルに対して sed スクリプトを実行するには、-f オプションを使用します。

sed -f ~/project/transform.sed ~/project/test.txt

以下のように表示されるはずです。

Ubuntu IS a powerful operating platform.
The developer interface IS very customizable.
Many Ubuntu developers prefer the command-line interface.
The platform resources are efficiently managed.

スクリプト内のすべての置換が適用されました!

スクリプトによる直接編集

コマンドラインの sed コマンドと同様に、-i オプションを使用してスクリプトで直接編集を行うことができます。

sed -i -f ~/project/transform.sed ~/project/test.txt

変更を確認しましょう。

cat ~/project/test.txt

ファイルには変換後のテキストが含まれているはずです。

スクリプトでのバックアップ作成

また、変更を加える前にバックアップを作成することもできます。

## First, let's restore the original content
cat > ~/project/test.txt << 'EOF'
Linux is a powerful operating system.
The user interface is very customizable.
Many Linux users prefer the command-line interface.
The system resources are efficiently managed.
EOF

## Now run sed with a backup
sed -i.bak -f ~/project/transform.sed ~/project/test.txt

変更後のファイルとバックアップの両方を確認しましょう。

cat ~/project/test.txt
cat ~/project/test.txt.bak

最初のコマンドでは変換後のテキストが表示され、バックアップファイルには元のテキストが含まれているはずです。

複数のファイルに対する sed スクリプトの適用

sed スクリプトを使用する利点の 1 つは、同じ変換を複数のファイルに簡単に適用できることです。

もういくつかのテストファイルを作成しましょう。

## Create test1.txt
cat > ~/project/test1.txt << 'EOF'
Linux offers excellent system performance.
Many users appreciate its stability.
EOF

## Create test2.txt
cat > ~/project/test2.txt << 'EOF'
The Linux community provides great support.
New users can find helpful resources online.
EOF

## Create test3.txt
cat > ~/project/test3.txt << 'EOF'
The system updates are well-managed in Linux.
Users can customize their experience.
EOF

では、これらすべてのファイルに一度に sed スクリプトを適用しましょう。

sed -i -f ~/project/transform.sed ~/project/test1.txt ~/project/test2.txt ~/project/test3.txt

変更を確認しましょう。

cat ~/project/test1.txt
cat ~/project/test2.txt
cat ~/project/test3.txt

3 つのファイルすべてに、スクリプトに従った変換後のテキストが表示されるはずです。

これは、同じ変換セットを使用して複数のファイルをバッチ処理するための sed スクリプトの威力を示しています。

まとめ

この実験では、Linux でテキストファイルを操作するために、ストリームエディタである sed を使用する方法を学びました。sed のいくつかの重要な側面に関する実践的な経験を積みました。

  • s コマンドを使用した基本的なテキスト置換
  • -i オプションを使用した直接編集
  • g フラグを使用したグローバル置換
  • -i.bak オプションを使用して編集前にバックアップを作成する
  • パターンに異なる区切り文字を使用する
  • アドレスと範囲を使用して特定の行を対象にする
  • より複雑な操作のために sed スクリプトを作成して実行する
  • 一度に複数のファイルに変換を適用する

これらのスキルは、Linux 環境での効率的なテキスト処理に不可欠です。エディタで開かずにテキストファイルを操作する能力は、大量のテキストデータを処理したり、複数のファイルに体系的な変更を加えたりする必要があるシステム管理者、開発者、データアナリストにとって特に価値があります。

Linux での作業を続けるうちに、sedgrepawkcut などの他のユーティリティとともに、テキスト処理ツールキットに欠かせないツールであることがわかるでしょう。