はじめに
Linux のストリームエディティングの実験へようこそ。この実験では、テキストの解析と変換に強力なコマンドラインユーティリティである sed (ストリームエディタ) の使い方を学びます。sed は、入力ストリーム (ファイルまたはパイプラインからの入力) に対して基本的なテキスト変換を行うために使用されます。
この実験の終了時には、以下のことができるようになります。
sedを使用して基本的なテキスト置換を行うsedを使用してファイルを直接編集する- ファイル全体にわたってグローバル置換を適用する
- 高度なテキスト処理技術を使用する
学んだスキルは、ファイルやテキストストリームを効率的に操作するのに役立ち、Linux での様々なシステム管理やテキスト処理タスクに不可欠です。
基本的な 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 を使う方法を学びましたが、変更は画面上にのみ表示され、ファイルに保存されませんでした。このステップでは、以下のことを学びます。
-iオプションを使ってファイルを直接編集する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
このコマンドは以下のことを行います。
sample.txtのバックアップをsample.txt.bakとして作成するsample.txt内の "Linux" のすべての出現箇所を "Ubuntu" に置き換える
両方のファイルを確認しましょう。
cat ~/project/sample.txt
cat ~/project/sample.txt.bak
最初のコマンドでは "Linux" がすべて "Ubuntu" に置き換えられた状態が表示され、バックアップファイルには依然として "Linux" が含まれているはずです。
高度な sed コマンドとパターンマッチング
これまでに sed を使った基本的な置換と直接編集をマスターしました。では、もう少し高度な機能を探ってみましょう。
- 異なる区切り文字を使用する
- アドレス範囲を使用して特定の行を対象にする
- 複数のコマンドを組み合わせる
異なる区切り文字を使用する
これまで置換コマンドではスラッシュ / を区切り文字として使用してきましたが、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 スクリプトファイルを作成する方が便利なことが多いです。これにより、以下のことが可能になります。
- 複数の
sedコマンドを整理する - 各コマンドの機能を説明するコメントを追加する
- 異なるファイルに同じ操作を再利用する
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 つの置換を行います。
- "Linux" のすべての出現箇所を "Ubuntu" に置き換える
- "user" のすべての出現箇所を "developer" に置き換える
- "system" のすべての出現箇所を "platform" に置き換える
- "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 での作業を続けるうちに、sed が grep、awk、cut などの他のユーティリティとともに、テキスト処理ツールキットに欠かせないツールであることがわかるでしょう。



