Linuxマスターへの道:sedコマンド50本ノック

Linux

ブログ運営者
さいとう

閲覧いただきありがとうございます!"さいとう"と申します。わたしは異業種・未経験からIT業界に転職し、現在インフラエンジニアとしてクラウド環境の設計や構築・運用の支援を行っています。


sedコマンドはLinuxでテキスト処理する際に有用なコマンドですよね。検索や置換、テキストの挿入・削除といった操作を手軽に実行できるのが魅力的です。


今回はsedについて、その魅力と使い方を紹介します。記事後半には"sedコマンド50本ノック“と題して、ハンズオンを50パターン用意しました。


↓【PR】Linuxの実践力をつけるために日々お世話になっています。



sedコマンドについて調べてみた

sedコマンドとは

sedコマンドは、テキスト処理を行うための強力なユーティリティで、主にストリームエディタとして使用されます。


sedは「stream editor」の略で、テキストファイルやパイプからの入力を処理し、標準出力に結果を出力します。主にテキストの検索、置換、挿入、削除などの操作を自動化するために用いられます。

sedコマンドの基本的な構文は次の通りです。

sed [オプション]... {スクリプト} [入力ファイル]...

ここで、スクリプトはsedに実行させたい命令を含み、入力ファイルは処理対象のテキストファイルです。オプションを使用することで、動作をカスタマイズできます。

sedコマンドの特徴と用途

  • テキストの検索と置換: sedは正規表現をサポートしており、パターンに一致するテキストの検索や置換を行うことができます。
  • スクリプトの実行: 複数のsedコマンドをスクリプトファイルに記述し、一度に実行することが可能です。
  • インプレース編集: -iオプションを使用すると、ファイルを直接編集し、元のファイルを変更することができます(一時ファイルを作成せずに)。
  • パイプラインとの組み合わせ: sedはパイプラインの一部として使用することができ、他のコマンドからの出力を加工したり、その出力を他のコマンドへ渡したりすることができます。


sedコマンドの使い方

テキストファイル内の文字列を置換する基本的な例を紹介します。

sed 's/検索パターン/置換文字列/g' ファイル名


このコマンドは、指定したファイル内の「検索パターン」に一致する全てのテキストを「置換文字列」に置換します。gフラグは、行内のすべての一致する部分を置換することを指示します。sedはその柔軟性と強力なテキスト処理能力により、シェルスクリプトや自動化スクリプトで広く使用されています。

sedコマンドのユースケース

1. 文字列の検索と置換

最も一般的な使用例です。特定の文字列を検索し、それを別の文字列で置換します。この操作は、設定ファイルやプログラムのソースコードなど、任意のテキストファイルに対して行うことができます。

sed 's/oldstring/newstring/g' file.txt


2. ファイルから特定の行を削除

sedを使用して、特定のパターンに一致する行や、特定の行番号の行を削除することができます。

# パターンに一致する行を削除
sed '/pattern_to_delete/d' file.txt

# 特定の行番号の行を削除(例:2行目)
sed '2d' file.txt


3. ファイル内のテキストを抽出または置換して新しいファイルを作成

sedを使用して加工した結果を新しいファイルにリダイレクトすることができます。

sed 's/old/new/g' oldfile.txt > newfile.txt


4. ファイル内の特定の位置にテキストを挿入または追加

特定の行にテキストを挿入したり、ファイルの末尾にテキストを追加したりすることができます。

# 3行目にテキストを挿入
sed '3i\This is the inserted text.' file.txt

# ファイルの末尾にテキストを追加
sed '$a\This is the appended text.' file.txt


5. ファイル内のパターンに基づいて行を変更または置換

特定のパターンに一致する行全体を新しいテキストで置換することができます。

sed '/pattern_to_match/c\New line of text' file.txt


6. ログファイルや出力から不要な情報をフィルタリング

システムログやコマンドの出力から特定の情報を抽出したり、不要な情報を除去したりする際に使用します。

grep 'ERROR' system.log | sed '/known_error/d'


sedコマンドの代表的なオプション

-e スクリプト

複数のコマンドを実行する場合に使用します。このオプションは省略可能ですが、複数のsedスクリプトを明示的に区別する場合に便利です。

sed -e 's/foo/bar/g' -e 's/baz/qux/g' filename


-i インプレース編集

ファイルを直接編集し、元のファイルに変更を適用します。バックアップを取る場合は、-i.bakのように拡張子を指定できます。

sed -i 's/old/new/g' filename


-n サイレントまたはクワイエットモード

このオプションを使用すると、自動的に出力されるすべての行が抑制されます。通常、pコマンド(印刷)と組み合わせて特定の行のみを出力します。

sed -n 'p' filename


-r または -E 拡張正規表現を使用

このオプションを使用すると、拡張正規表現(ERE)の構文を使用できるようになります。これにより、より複雑なパターンマッチングが可能になります。

sed -r 's/([a-z]+) ([a-z]+)/\2 \1/' filename


-f スクリプトファイル

sedコマンドを含むスクリプトファイルを指定します。このオプションを使用すると、コマンドライン上で直接スクリプトを指定する代わりに、ファイルから読み込むことができます。

sed -f script.sed filename


sedコマンドハンズオン

sedコマンドに慣れるために、ハンズオンをこなしていきましょう。作業ディレクトリに次のテキストファイルを用意してください。

sample_text.txt

Hello, this is a sample text file.
This file contains multiple lines of text.
The purpose of this file is to demonstrate various sed command examples.
You will see how sed can be used to manipulate text files.
This includes searching for text, replacing text, and deleting lines.
We will also show how to insert and append text with sed.
Finally, you will learn how to modify files in-place with sed.
Thank you for trying out these sed command examples.
2024/01/03 by saito


iオプションを使用しない限り、元のファイルは変更されません。どこが変わったか知りたい方は、別ファイルに出力し、差異を確認してみましょう。

modified_sample_text.txt
diff sample_text.txt modified_sample_text.txt


sedコマンド50本ノック

1. テキストの検索と置換

ファイル内の「text」を「TEXT」に置換します。

sed 's/text/TEXT/g' sample_text.txt


2. 特定の行のテキストを置換

3行目の内容を「This is the third line.」に置換します。[.]に関して、[.]は任意の単一文字にマッチし、[]は直前の文字が0回以上繰り返すことを意味しています。したがって、.*はその行の全ての文字にマッチするという意味です。

sed '3s/.*/This is the third line./' sample_text.txt


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

「sed」を含む行を全て削除します。[d]は「delete」の略で、指定されたパターンにマッチする行を削除するようsedに指示します。

sed '/sed/d' sample_text.txt


4. 行番号で特定の行を削除

5行目を削除します。

sed '5d' sample_text.txt


5. ファイルの末尾にテキストを追加

ファイルの最後に新しい行を追加します。[a]は「append」の略で、マッチした行の直後に新しいテキストを挿入するアクションを指示し、実際に新しい行を挿入するテキストはa\の直後に記述されます。

sed '$a\This is a new line at the end of the file.' sample_text.txt


6. ファイルの先頭にテキストを挿入

ファイルの最初に新しい行を挿入します。

sed '1i\This is a new line at the beginning of the file.' sample_text.txt


7. 特定のパターンに一致した後の行にテキストを挿入

「manipulate」を含む行の後に新しい行を挿入します。

sed '/manipulate/a\This line is inserted after the first match of "manipulate".' sample_text.txt


8. 特定の行を複数回繰り返し出力

4行目を3回繰り返して出力します。

sed '4{p;p;}' sample_text.txt


9. ファイル内のすべての行を番号付け

各行の先頭に行番号を付けて出力します。

sed '=' sample_text.txt | sed 'N;s/\n/ /'


10. 特定のパターンを含む行を大文字に変換

「text」を含む行全て大文字に変換します。

sed '/text/{
s//TEXT/g
}' sample_text.txt


11. 特定のパターンに一致する行だけを表示

「Hello」を含む行のみを表示します。

sed -n '/Hello/p' sample_text.txt


12. パターンに一致しない行を削除

「text」を含まない行をすべて削除します。[!]は直前のパターンにマッチしない行に対して、直後のコマンドを適用することを示します。

sed '/text/!d' sample_text.txt


13. 指定した範囲の行のみを操作

2行目から4行目のテキストを「Selected lines.」に置換します。

sed '2,4s/.*/Selected lines./' sample_text.txt


14. ファイルの特定のセクションにテキストを追加

3行目の後に複数行を追加します。

sed '3a\This is the first added line.\nThis is the second added line.' sample_text.txt


15. 特定のパターンに一致した最初の行のみを置換

「text」を「TEXT」に置換しますが、最初に一致したもののみ変更します。

sed '0,/text/{s/text/TEXT/}' sample_text.txt


16. 各行の末尾にテキストを追加

各行の終わりに「 – end」を追加します。

sed 's/$/ - end/' sample_text.txt


17. 特定のパターンが含まれる行を折り返して表示

「text」を含む行を見つけ、その行を新しい行に分割して表示します。

sed '/text/{G;}' sample_text.txt


18. 特定のパターンに一致する行を次の行と入れ替え

「text」を含む行とその次の行を入れ替えます。[N]は、パターンスペース(現在処理中の行を保持するsedのワークスペース)に次の行を追加し、両行を改行文字で区切って結合。[P]はパターンスペースの最初の部分(最初の改行まで)を出力します。ここでは、結合された2行のうち先頭の行(入れ替え後)を出力。[D]はパターンスペースの最初の部分を削除し、もしパターンスペースに何も残っていなければ次のサイクルに進みます。そうでない場合は、残りの部分(この場合は2行目)が新しいサイクルの入力となります。これにより、処理済みの行が削除され、次の行に進みます。

sed -n '{N;/\ntext/{s/\(.*\)\n\(.*\)/\2\n\1/};P;D;}' sample_text.txt


19. ファイルの各行の先頭にテキストを追加

各行の始まりに「Start: 」を追加します。

sed 's/^/Start: /' sample_text.txt


20. 特定のパターンを含む行をコメントアウト

「sed」を含む行の先頭に「#」を追加してコメントアウトします。

sed '/sed/s/^/#/' sample_text.txt


↓【PR】Linuxの実践力をつけるために日々お世話になっています。



21. 特定の行を削除してその行の内容を表示

5行目を削除し、削除された行の内容を表示します。

sed -n '5{p;d;}' sample_text.txt


22. 連続する空行を1行に圧縮

連続する空行を1行の空行に圧縮します。事前にsample_text.txtのどこかに2行以上の空行を挿入してください。

sed '/^$/N;/\n$/D' sample_text.txt


23. 特定の行から次にパターンに一致する行までを削除

3行目から次に「sed」を含む行までを削除します。

sed '3,/sed/d' sample_text.txt


24. 特定のパターンを含む行を別のファイルに書き出す

「text」を含む行を別のファイルに書き出します。

sed -n '/text/w extracted_lines.txt' sample_text.txt


25. 特定のパターンに一致するすべての行の前に行を挿入

「sed」を含む各行の前に新しい行を挿入します。

sed '/sed/i\This is a new line before every match of "sed".' sample_text.txt


26. 指定した範囲の外の行を削除

2行目から4行目以外のすべての行を削除します。

sed '1,2!d' sample_text.txt


27. 特定のパターンを含む行を別のパターンで置換

「text」を含む行を「Example text line.」で置換します。

sed '/text/c\Example text line.' sample_text.txt


28. ファイルの奇数行または偶数行だけを表示

奇数行だけを表示します。

sed -n 'p;n;' sample_text.txt


偶数行だけを表示します。

sed -n 'n;p;' sample_text.txt


29. 各行の最初に見つかった単語を大文字に変換

各行の最初に見つかった単語を大文字にします。

sed 's/\<./\U&/' sample_text.txt


30. 特定のパターンに一致する行のみを複数回繰り返して出力

「text」を含む行を3回繰り返して出力します。

sed '/text/{p;p;}' sample_text.txt


31. ファイルの最後の行を削除

ファイルの最後の行を削除します。

sed '$d' sample_text.txt


32. ファイル内の全ての空行を削除

空行をすべて削除します。

sed '/^$/d' sample_text.txt


33. 特定のパターンに一致した行の次の行にテキストを挿入

「sed」を含む行の次の行にテキストを挿入します。

sed '/sed/{n;a\This line is inserted after a line containing "sed".
}' sample_text.txt


34. ファイル内の全ての行を逆順に表示

sed '1!G;h;$!d' sample_text.txt

35. 特定のパターンに一致する各行の末尾にテキストを追加

「text」を含む各行の末尾に「 – found」を追加します。

sed '/text/s/$/ - found/' sample_text.txt


36. 特定のパターンに一致する行を見つけたら、その行と次の行を削除

「sed」を含む行とその次の行を削除します。

sed '/sed/{N;d;}' sample_text.txt

37. 特定のパターンに一致する最後の行だけを変更

ファイルの最後に「sed」を含む行がある場合、その行を「This is the last sed line.」に置換します。

sed '$!{h;d;};x;s/sed/This is the last sed line./' sample_text.txt


38. ファイル内の特定のパターンに一致する行数をカウント

「text」を含む行の数をカウントします。

sed -n '/text/p' sample_text.txt | wc -l


39. 特定のパターンを含むすべての行を囲む

「text」を含む各行の前後に特定のテキストを挿入します。

sed '/text/{i\--- Start of the line ---
a\--- End of the line ---
}' sample_text.txt


40. 特定のパターンに一致する行を次の行と交換

「sed」を含む行とその次の行を交換します。

sed '/sed/{N;s/\(.*\)\n\(.*\)/\2\n\1/;}' sample_text.txt


41. 特定のパターンに一致する行を大文字に変換

「text」を含む行を全て大文字に変換します。

sed '/text/{
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
}' sample_text.txt


42. ファイルの最初と最後の行を削除する

ファイルの最初の行と最後の行を削除します。この操作は、ヘッダーやフッターを除去する際に有用です。

sed '1d; $d' sample_text.txt


43. 特定のパターンに一致した行を含むセクションを抽出

「This」で始まる行から「sed」を含む行までを抽出します。

sed -n '/This/,/sed/p' sample_text.txt


44. 特定のパターンに一致する行に行番号を付けて表示

「text」を含む行に行番号を付けて表示します。

sed '/text/=' sample_text.txt


45. 各行の先頭と末尾の空白を削除

各行の先頭と末尾の空白(スペースやタブ)を削除します。

sed 's/^[ \t]*//;s/[ \t]*$//' sample_text.txt


46. ファイル内の全ての数字を削除

ファイルから数字をすべて削除します。

sed 's/[0-9]//g' sample_text.txt


47. ファイル内の特定のパターンを含む行以外をすべて削除

「text」を含む行以外をすべて削除し、その行だけを表示します。

sed -n '/text/p' sample_text.txt


48. ファイルの各行に番号を付ける

各行の前に行番号を付けて表示します。

sed = sample_text.txt | sed 'N;s/\n/ /'


49. 特定のパターンに一致する行のみをファイルに出力

「This」を含む行を新しいファイルに出力します。

sed -n '/This/w newfile.txt' sample_text.txt | less newfile.txt


50. 特定の行範囲をコメントアウト

2行目から4行目の行をコメントアウトします(例としてシェルスクリプトやバッチファイルでの使用を想定)。

sed '2,4s/^/#/' sample_text.txt

sedコマンド50本ノックお疲れさまでした。


まとめ

sedコマンドは検索や置換、テキストの挿入・削除といった操作を手軽に実行できる便利なコマンドです。しかし、コマンドに慣れていないと、期待通りの処理ができなかったり、間違った結果が返ってきたりします。ハンズオンを通して、実務で使えるようになっていきましょう。

↓【PR】Linuxの実践力をつけるために日々お世話になっています。