ストリーム エディターの概要
ストリーム エディター (sed
) は、テキストの解析と操作に役立つ便利なツールです。 標準入力またはファイルからテキストを取得して変換するのに使用できます。 sed
ツールでは、非対話的な方法でテキストを行ごとに編集します。 この方法では、コマンドを呼び出しながら判断していきます。 これらの指示は自動的に実行されます。 この機能により、sed
はテキストを変換するための強力で高速なツールになります。
基本的な使用方法
sed
ツールを使って、stdin
またはファイルからテキストを取得して操作します。 この動作により、別のコマンドの出力を sed
ツールに直接送って編集することができます。 以前に作成または編集したファイルから作業することもできます。
sed
コマンドは、既定ではすべて stdout
に出力されることに注意してください。 編集したテキストを保存する場合は、>
コマンドの場合と同様に、リダイレクト演算子 (cat
) を使って出力をリダイレクトする必要があります。
sed
の基本的な使用方法は sed [options] commands [file-to-edit]
です。
NASA-software-API.txtファイルで次の基本的な
sed
コマンドを試してください。sed '' NASA-software-API.txt
このコマンドは、stdout
コマンドで見たのと同じように、ファイルの内容を cat
に出力します。 単一引用符には、sed
コマンドへの編集指示を含めます。 この場合、編集の指示は何も渡していないので、コマンドは受け取った各行をターミナルに出力します。
sed
ツールは、ファイルではなく stdin
からの入力に対して動作し、コマンドからの出力を保存することもできます。
sed を使用したテキスト置換
おそらく、テキスト置換が sed
ツールの使用法として最もよく知られています。 先ほど説明したように、sed
コマンドでは、正規表現を使用してテスト パターンを検索できます。 それだけでなく、このツールは一致したテキストを別のものに置き換えることもできます。
テキスト置換の一般的な構文は sed s'/old_text/new_text/'
です。文字 s
は substitute (置換) を意味する編集指示で、スラッシュ (/
) は置換で使うテキストを区切ります。
URL https://www.nasa.gov/about/sites/index.html
があり、URL の index.html
の部分をテキスト home
に置き換えたいとします。
この置換は、次の
sed
コマンドを使って行います。echo "https://www.nasa.gov/about/sites/index.html" | sed s'/index.html/home/'
変更された URL が出力に表示されます。
https://www.nasa.gov/about/sites/home
NASA-software-API.txt ファイル内のコンテンツに対していくつかの置換操作を試してみましょう。
"NASA" という略語を "National Aerospace Agency" という正式な名称に置き換えます。置換を行う前に、"NASA" という略語のインスタンスの数をカウントします。sed
ツールを実行した後、カウントを確認してすべてのインスタンスが置換されたことを確認します。
NASA-software-API.txt ファイルを Cloud Shell エディターで開きます。
code NASA-software-API.txt
統合エディターの検索ボックスを開き、文字列
NASA
を入力します。検索ボックスの結果には、"NASA" という略語に 27 件の一致が表示されます。
ヒント
Cloud Shell エディターで使う領域を減らすために、エディターとターミナルを分離するコンテンツ分割バーを使用できます。 この調整を行うと、ターミナルでコマンド出力を見るためのスペースが広くなります。
次に、
sed
コマンドを実行して置換を行います。sed 's/NASA/National Aerospace Agency/' NASA-software-API.txt
"NASA" のすべての一致で置換が行われますが、コマンドはファイルのすべての行をターミナル (
stdout
) に出力することに注意してください。 これは、sed
ツールの既定の動作です。置換が適用された行だけを出力するには、
-n
フラグを使います。 また、編集指示でp
オプションを渡すと、自動出力を抑制することができます。もう一度
sed
コマンドを実行し、パターン置換が適用された行だけを出力します。sed -n 's/NASA/National Aerospace Agency/p' NASA-software-API.txt
今回は
-n
フラグとp
オプションを使っているので、出力が少なくなっています。
ファイルに書き込む
sed
ツールの最も一般的な使い方の 1 つは、解析または編集操作の結果をキャプチャすることです。 前の例では、コマンドの結果を確認する能力には限界がありました。 ターミナルに表示されるコマンドの出力しか見ることができなかったのです。
この問題を解決するために、sed
コマンドの 3 番目の区切り記号の後に使用できる別のフラグがあります。 w
フラグでは、コマンドから変更されたデータを受け取るファイルを指定できます。
もう一度、先ほどのコマンドを試してみましょう。 今回は、sed
コマンドで変更された内容をすべて新しいファイルに書き込みます。
sed
コマンドを実行して、置き換えられた行のみを印刷し、変更したデータを新しいファイル (NASA-replaced.txtなど) に送信します。sed -n 's/NASA/National Aerospace Agency/w NASA-replaced.txt' NASA-software-API.txt
ls
を実行すると、ディレクトリに新しいファイルが表示されます。file1 file2 NASA-logs-1995.txt NASA-replaced.txt NASA-software-API.txt
新しいファイルを Cloud Shell エディターで開きます。
新しいファイルには 26 行のコンテンツがあります。
課題
検索ボックスを使って新しいファイル内で文字列 "NASA" を探すと、この略語のインスタンスが 1 つ残っていることに気がつきます。 sed
コマンドの呼び出しでは、26 個の置換が行われただけです。
NASA-software-API.txt ファイル内の 1 つの行に、"NASA" の省略形が 2 つありました。 sed
コマンドを呼び出すと、最初のインスタンスが正常に置換されました。 "NASA" の 2 つ目のインスタンスは "NASAViz" という用語に含まれています。
確認したコマンドを使って、この最終的な置換を行うことができますか?