前回の記事では、bashの関数と、それをコマンドラインから直接使用する方法について説明し、他にもいくつかのクールなものを見てきました。
私たちは、ログ ファイルや設定ファイルなどのテキスト ファイルを操作するために sed を使用します。
この投稿では、bash スクリプトを使用する上で不可欠なテキスト操作に使用される sed Linux コマンドに焦点を当てます。
Linuxシステムは、テキスト処理のためのツールをいくつか提供していますが、そのうちの1つがsedです。
31以上の例を、すべての例の出力を示す写真とともに説明します。
目次
Understand sed Linux command
sedコマンドは、非対話型のテキストエディタです。
$ sed options file
sedはファイル操作に限定されず、以下のようにSTDINに直接適用することもできます。
$ echo "Welcome to LikeGeeks page" | sed 's/page/website/'
sコマンドは、1つ目のテキストを2つ目のテキストパターンで置き換えます。 この例では、文字列「website」を単語「page」に置き換えました。
上記の例は、ツールを実演するための簡単な例でした。
サンプルファイルを作成してみましょう :
$ sed 's/test/another test/' ./myfile
結果は瞬時に画面に表示されますので、ファイルを最後まで処理するのを待つ必要はありません。
ファイルのサイズが大きければ、処理が終わる前に結果が表示されます。
Sed Linuxコマンドはデータを更新しません。 変更されたテキストをSTDOUTに送るだけです。 ファイルにはまだ手が加えられていません。 既存のコンテンツを上書きする必要がある場合は、リダイレクトについて話していた以前の記事を確認してください。
コマンドラインで複数の sed Linux コマンドを使用する
複数の sed コマンドを実行するには、次のように -e オプションを使用します。
$ sed -e 's/This/That/; s/test/another test/' ./myfile
sed コマンドは、スペースを入れずにセミコロンで区切らなければなりません。
また、シングルクォーテーションを使って、次のようにコマンドを分けることもできます。
$ sed -e '> s/This/That/> s/test/another test/' myfile
結果は同じで、大したことはありません。
ファイルからのコマンドの読み込み
sedコマンドをファイルに保存しておき、-fオプションでファイルを指定して使用することができます。
$ cat mycommandss/This/That/s/test/another test/
$ sed -f mycommands myfile
フラグの代用
次の例をよく見てください。
$ cat myfile
$ sed 's/test/another test/' myfile
上記の結果は、各行の最初の出現箇所を置き換えたことを示しています。
次のような置換フラグを使うことができます。
s/pattern/replacement/flags
置換には4つのタイプがあります:
- g, すべての出現箇所を置き換える。
- p, 元の内容を印刷する。
- w file: 結果をファイルに書き込むことを意味します。
次のように、置換するオカレンス番号を指定することで、置換を制限することができます:
$ sed 's/test/another test/2' myfile
見てわかるように、各行の2番目のオカレンスだけを置換しています。
g フラグはグローバルを意味し、すべての出現箇所をグローバルに置き換えることを意味します:
$ sed 's/test/another test/g' myfile
p フラグは、パターン マッチを含む各行を表示しますが、-n オプションを使用して変更された行のみを表示することもできます。
$ cat myfile
$ sed -n 's/test/another test/p' myfile
w フラグは、出力を指定したファイルに保存します。
$ sed 's/test/another test/w output' myfile
出力を画面に表示しましたが、一致する行を出力ファイルに保存しました。
文字の置換
たとえば、sed を使用して /etc/passwd ファイル内で bash シェルを検索し、それを csh シェルに置換したいとしましょう。
$ sed 's!/bin/bash!/bin/csh!' /etc/passwd
これで読みやすくなりました。
Limiting sed
sedコマンドは、ファイル全体を処理します。
- 行の範囲。
- 特定の行にマッチするパターン。
数字を1つ入力することで、特定の行に制限することができます:
$ sed '2s/test/another test/' myfile
2行目だけを修正しました。
行の範囲を使う場合はどうでしょうか:
$ sed '2,3s/test/another test/' myfile
また、ファイルの最後までの行から始めることもできます。
$ sed '2,$s/test/another test/' myfile
または、次のようなパターンを使用することもできます。
$ sed '/likegeeks/s/bash/csh/' /etc/passwd
すごい!
このパターンを正規表現で書くと、より汎用的で便利になります。
行の削除
sedを使って行を削除するには、delete (d)フラグがお勧めです。
deleteフラグは、元のファイルではなく、ストリームからテキストを削除します。
$ sed '2d' myfile
ここでは、myfileから2行目のみを削除しています。
行の範囲を削除する場合はどうでしょうか。
$ sed '2,3d' myfile
ここでは、2行目と3行目の行の範囲を削除しています。
別のタイプの範囲:
$ sed '3,$d' myfile
ここでは、3行目からファイルの最後までを削除します。
これらの例はすべて、元のファイルを変更することはありません。
$ sed '/test 1/d' myfile
ここでは、パターンを使用して、1行目でマッチした場合にその行を削除します。
行の範囲を削除する必要がある場合は、次のような 2 つのテキスト パターンを使用できます:
$ sed '/second/,/fourth/d' myfile
2 行目から 4 行目までを削除しました。
テキストの挿入と追加
次のフラグを使って、テキストの行を挿入したり追加したりすることができます:
- (i)フラグ。
- (a)フラグ。
$ echo "Another test" | sed 'i\First test '
指定した行の前にテキストを追加しました。
$ echo "Another test" | sed 'a\First test '
指定した行の後にテキストを追加しました。
では、真ん中にテキストを追加するのはどうでしょうか?
簡単です。次の例を見てください:
$ sed '2i\This is the inserted line.' myfile
そして、追加も同じように動作しますが、追加されたテキストの位置を見てください。
$ sed '2a\This is the appended line.' myfile
同じフラグを使用していますが、挿入や追記の位置を指定しています。
行の修正
特定の行を修正するには、次のように (c) フラグを使用します。
$ sed '3c\This is a modified line.' myfile
正規表現のパターンを使用することができ、そのパターンに一致するすべての行が修正されます。
$ sed '/This is/c Line updated.' myfile
文字の変換
変換フラグ(y)は次のような文字に作用します。
$ sed 'y/123/567/' myfile
すべてのデータに変換を適用したので、特定の出現場所に限定することはできません。
行番号の表示
次のように(=)記号を使って行番号を表示することができます。
$ sed '=' myfile
ただし、-nと等号を組み合わせることで、sedコマンドはマッチングを含む行番号を表示することができます。
$ sed -n '/test/=' myfile
ファイルからデータを読み込む
ファイルからデータを読み込むには、(r)フラグを使用します。
読み込みたいテキストの行番号やテキストパターンを定義することができます。
$ cat newfile
$ sed '3r newfile' myfile
予想通り3行目以降にコンテンツを挿入しました。
そして、これはテキストパターンを使用しています:
$ sed '/test/r newfile' myfile
かっこいいでしょう?
便利な例
プレースホルダー付きのテキストを含むファイルと、他のファイルのプレースホルダーを埋めるデータを含む別のファイルがあるとしましょう。
それを実際のコンテンツに置き換えます。
$ Sed '/DATA>/ {r newfiled}' myfile
すごい!!見ての通り、プレースホルダーの場所を他のファイルからのデータで埋めました。
これは sed コマンドについてのほんの小さな紹介です。
唯一の制限は、あなたの想像力です。
sed Linuxコマンドを使って、文字列を簡単に操作できることがお分かりいただけたと思います。
ありがとうございました。
LikeGeeksの創設者です。 2010年からLinuxのシステム管理者として働いています。 世界中の複数の顧客のために、Linuxサーバーの維持、保護、トラブルシューティングを担当しています。 仕事を自動化するためにシェルやPythonのスクリプトを書くのが好きです。