Sed は、テキストのフィルタリングと変換に使用される UNIX ライクなオペレーティング システムのストリーム エディターです。 Sed は基本的なライン エディター 'ed' から派生したものです。このエディターはすべての Unix システムに見られますが、ユーザー インターフェースが難しいためめったに使用されません。
sed の仕組み
sed はストリーム エディターであるため、パイプなどを介して stdin から受信したデータ ストリームに対して作業を行い、その結果を stdout (多くの場合デスクトップ画面) にデータ ストリームとして書き込みます。この出力をファイルにリダイレクトできます。 Sed は通常、元の入力ファイルを変更しません。代わりに、パイプを介してファイルの内容を送信し、sed で処理することができます。これは、変更したいデータを含むファイルをディスク上に置く必要がないことを意味します。これは、既にファイルに書き込まれているのではなく、別のプロセスからのデータがある場合に特に便利です。
sed の構文
# sed [option] commands [input-file]
この投稿では、sed コマンドの実用的な例について説明します。ファイル 'passwd' に対して多くの sed 操作を行うため、最初にファイル '/etc/passwd' を /tmp フォルダーにコピーします。
# cp /etc/passwd /tmp/
例 1:sed を使用してすべての行を削除する
# cat /tmp/passwd | sed 'd'
上記のコマンドは、ファイル /tmp/passwd の内容全体をパイプ経由で sed に送信しました。ファイル /tmp/passwd はまったく変更されていないことに注意してください。 Sed はファイルの内容を読み取るだけで、ファイルに書き込むように指示せず、ファイルから読み取るだけでした。各行の編集コマンドの結果が標準出力に出力されます。この場合、オプション「d」を使用してすべての行を削除したため、画面には何も出力されませんでした。
例 2:sed を「-e」オプションで呼び出す (実行するコマンドにスクリプトを追加)
パイプ経由でファイルを送信して sed を呼び出す代わりに、以下の例に示すように、ファイルからデータを読み取るように sed に指示できます。
# sed -e 'd' /tmp/passwd #
この方法で sed を呼び出すと、編集コマンドが、入力ファイル /tmp/passwd に対して実行される sed スクリプトとして明示的に定義されます。このスクリプトは、ここでは 1 文字の編集コマンドにすぎませんが、もっと大きくなる可能性があります。
sed コマンドからの標準出力をファイルにリダイレクトすることもできます。
# sed -e 'd' /tmp/passwd > /tmp/new-passwd
例 3:sed を使用して行を出力する (-n フラグと p コマンド)
「-n」フラグは自動印刷を無効にするため、「p」コマンドで明示的に指示された場合にのみ、sed が代わりに行を印刷します。
# cat /tmp/passwd | sed 'p' | head -5 root:x:0:0:root:/root:/bin/bash root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin
上記のように、「-n」フラグなしで「p」編集コマンドを指定すると、sed は重複した行を出力します。したがって、一意の行を表示するには、sed の p コマンドで「-n」フラグを使用します。以下に例を示します:
# cat /tmp/passwd | sed -n 'p' | head -5 root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync
例 4:「-i」オプションを使用してソース ファイルを編集する
デフォルトでは、sed コマンドは元のファイルまたはソース ファイルを安全に編集しませんが、「-i」オプションを使用することでソース ファイルを編集できます。
# sed -i '1d' /tmp/passwd
上記のコマンドは、ソース ファイル /tmp/passwd の最初の行を削除します。
例 5:編集前にソース ファイルのバックアップを取る
sed コマンドで「-i」オプションを使用すると、ソース ファイルを直接編集するため、非常に危険です。そのため、編集前にソース ファイルのバックアップを取ることをお勧めします。例を以下に示します。
# sed -i.bak '1d' /tmp/passwd
# ls -l /tmp/passwd* -rw-r--r-- 1 root root 2229 Nov 24 22:36 /tmp/passwd -rw-r--r-- 1 root root 2261 Nov 24 22:35 /tmp/passwd.bak
上記の sed コマンドでは、ファイル /tmp/passwd の 1 行目が削除されますが、その前に sed コマンドは /tmp/passwd のバックアップを /tmp/passwd.bak として取得します。
例 6:範囲指定による行の削除
/tmp/passwd ファイルの最初の 5 行を削除しています。
# cat /tmp/passwd | sed '1,5d'
例 7:ファイルの空行を削除する
# cat /tmp/detail.txt 245 678 linux unix suse
details.txt ファイルには 2 つの空行があります。以下のコマンドを使用して空行を削除してください。
# sed '/^$/d' /tmp/detail.txt 245 678 linux unix suse
例 8:文字列を含む行の削除
「games」という単語を含む /tmp/passwd ファイルから行を削除するとします。
# sed '/games/d' /tmp/passwd
例 9:ファイル内の文字列を検索して置換する
「root」を「Admin」に置き換えたいとします。以下に例を示します。
# sed 's/root/Admin/' /tmp/passwd
sed は行の最初の出現のみを置換することに注意することは非常に重要です。文字列「root」が 1 行に複数回出現する場合、最初に一致したものだけが置き換えられます。ファイル内のすべての文字列を最初の文字列だけでなく新しい文字列に置き換えるには、グローバルに置換するには、以下に示すようにコマンドの最後に文字「g」を追加します:
# sed 's/root/Admin/g' /tmp/passwd
例 10:-e オプションを使用した複数置換
「root」文字列を「Admin」に、「bash」文字列を「sh」に置き換えたいとします。以下に例を示します:
# cat /tmp/passwd | sed -e 's/root/Admin/g' -e 's/bash/sh/g'