logo

Linux/Unix の Sed コマンドと例

Linuxの「sed」コマンドはストリームエディタの略です。正規表現を使用してストリーム(ファイル)を編集するために使用されます。ただし、この編集は永続的なものではありません。表示上だけ残りますが、実際にはファイルの内容は変わりません。

主にテキストの置換に使用されます。さらに、挿入、削除、検索などの他のテキスト操作操作にも使用できます。 sed コマンドを使用すると、ファイルを開かずに編集できます。正規表現のサポートにより、より強力なテキスト操作ツールになります。

sedコマンドの概要

これは、コンパクトでシンプルなプログラミング言語を使用してテキストを変換および解析する Unix ユーティリティです。これは、1973 年から 1974 年にかけてベル研究所の Lee E. McMahon によって統合され、現在ではほぼすべてのオペレーティング システムに存在します。 sed コマンドは、以前の qed (クイック エディター) および ed インタラクティブ エディターのスクリプト化の側面に基づいています。これは、正規表現をサポートするための最も初期のツールであり、テキスト処理、特に置換コマンドでアクティブなままです。有名な代替ツールとしては、Perl や AWK などがあります。 「ストリーム編集」 そして平文文字列の操作。

sedコマンドの動作モード

sed コマンドは、行指向のテキスト処理ユーティリティです。ファイルまたは入力ストリームからテキストを 1 行ずつ読み取り、パターン スペースと呼ばれる内部バッファに入れます。すべてのライン読み取りによってサイクルが開始されます。 sed コマンドは、sed スクリプトによってパターン空間に記述された 1 つまたは複数の操作を使用します。テキスト上で操作を記述する約 25 個のコマンドを使用してプログラミング言語を操作します。

すべての入力行について、sed コマンドは通常、パターン スペースを生成し、スクリプトの実行後に次の行からサイクルを再度開始します。他のスクリプト終了の性質は、スクリプト コマンドやオプションの設定から利用できます。たとえば、次の行をパターン スペースにすぐに含める N、終了する q、パターン スペースを削除する d などです。したがって、sed スクリプトはストリームラインから反復されるループ本体に関連しており、ループ変数とループ自体は sed によって暗黙的に維持されます。

  • sed スクリプトは、コマンドラインで記述することも、分離されたファイルを通じて読み取ることもできます。 sed スクリプトでは、コマンドは正規表現または行番号のコンテキストで追加のアドレスを取得する場合があります。アドレスによって、コマンドがいつ実行されるかが決まります。たとえば、2d は 2 番目の入力行でのみ d (または削除) コマンドを実行しますが、/^ /d はスペースで始まるすべての行を削除します。
  • 保持スペース (独立した特別なバッファ) は、サイクル間で蓄積されたテキストを保持するために一部の sed コマンドによって使用される場合があります。 sed のコマンド言語には 2 つの変数 (パターン スペースとホールド スペース) のみがあり、GOTO のような分岐機能があります。ただし、言語はチューリング完全です。難解な sed スクリプトは、テトリス、チェス、アルカノイド、倉庫番などのいくつかのゲームで利用できます。
  • メイン ループは入力ストリームのすべての行に対して実行され、入力のすべての行で sed スクリプトをチェックします。 sed スクリプトの行はすべてパターンとアクションのペアであり、一致するパターンと実装するアクションを表し、条件付きステートメントとしてコピーできます。デフォルトのアクション (パターン スペースの印刷、パターン スペースへの行のコピー)、入力ストリームと出力ストリーム、および作業変数 (ホールド スペースとパターン スペース) は暗黙的です。メインループがあるため、簡潔なワンライナープログラムを指定することができます。

sedコマンドの使用方法

    置換コマンド
    以下の例は、sed コマンドの最も一般的なコマンドと典型的な使用法 (置換) を示しています。この使用法が sed コマンドの実際の動機でした。
    sed 's/regexp/replacement/g' 入力ファイル名 > 出力ファイル名sedのその他のコマンド
    他の方法では、約 25 個の sed コマンドを使用した単純な処理も可能です。たとえば、以下では、スペースと行末文字のみを含む行をフィルタリングするために d オプションを使用しています。
    sed '/^ *$/d' inputFileName
    上の例では、以下の正規表現メタキャラクターのいくつかを使用しています。
    • キャレット (^) は行の先頭と同じです。
    • ドル記号 ($) は行の完成と同じです。
    • アスタリスク (*) は、以前に出現した 1 つ以上の文字と同じです。
    • プラス記号 (+) は、前の 1 つまたは複数の文字の出現と同じです。
    • 疑問符 (?) は、前の文字の出現と同じかゼロです。
    • ドット記号 (.) は 1 つの文字とまったく同じです。
    フィルタとしての sed
    多くの場合、sed コマンドは Unix のパイプライン内のフィルターとして使用されます。
    $generateData | sed 's/x/y/g'
    generateData プログラムはデータを生成し、sed コマンドは y の代わりに x を置き換えることによって小さな変更を加えます。ファイルベースの sed スクリプト
    多くの場合、多くの sed コマンド (各行に 1 つのコマンド) をスクリプト ファイル内に配置し、 -f フラグを使用してファイルからコマンドを実行すると便利です。
    sed -f subst.sed 入力ファイル名 > 出力ファイル名

構文:

 sed [OPTION]... {script-only-if-no-other-script} [input-file]... 

オプション:

sed コマンドのコマンド ライン オプションの一部を次に示します。

-n、--clean、--silent: 強制的にパターン空間の印刷を可能にします。

-e スクリプト、--expression=スクリプト: 実行するコマンドにスクリプトを追加するために使用されます。

-f スクリプトファイル、--file=スクリプトファイル: 実行するコマンドにスクリプトファイルの内容を追加するために使用されます。

--follow-symlinks: これは、インプレースで処理するときにシンボリックリンクをたどるために使用されます。

-i[サフィックス]、--in-place[=サフィックス]: ファイルをその場で編集するために使用されます (SUFFIX オプションが指定されている場合はバックアップを作成します)。

メイブンのインストール

-l N、--line-length=N: これは、「l」コマンドの希望する行折り返しの長さを指定するために使用されます。

--posix: すべての GNU 拡張機能を無効にするために使用されます。

-E、-r、--regexp-extended: これにより、スクリプト内で拡張正規表現を使用できるようになります (移植性を高めるには、POSIX -E を使用します)。

-s、--分離: これは、ファイルを単一ではなく個別のものとして考慮するために使用され、長いストリームを継続します。

--サンドボックス: サンドボックス モードで動作するために使用されます。

-u、--unbuffered: これは、入力ファイルから最小限のデータをロードするために使用され、出力バッファーをより頻繁にフラッシュします。

-z、--null-data: NUL 文字で行を区切るために使用されます。

- ヘルプ: ヘルプマニュアルを表示するために使用します。

- バージョン: バージョン情報を表示するために使用されます。

sedコマンドの例

次の例を見てみましょう。

STDINディレクトリへの適用

sed コマンドはファイルの操作だけに限定されません。また、それを STDIN ディレクトリに適用することもできます。

 echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/' 

上記のコマンドは、最初のテキストを 2 番目のテキスト パターンに置き換えます。以下の出力を考えてみましょう。

Linux Sed フィルター

上記の出力から、まず、文字列「class7」に対して「sed」コマンドを実行しました。ここで、「class」は「jtp」に、7は10に変更されます。次に、ストリーム「msg.txt」に対して「sed」コマンドを実行しました。 ' ここで、「学ぶ」は「勉強」に変換されます。

グローバルな置き換え

前の例では、すべての「学習」という単語が「学習」に編集されませんでした。すべての単語を編集するには、グローバル置換「g」を使用する必要があります。ファイルまたは文字列内の指定されたすべての単語を編集します。

構文:

 command | sed 's///g' 

以下の例を考えてみましょう。

 echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g' 

上記のコマンドは、指定されたすべてのテキスト パターンを置き換えます。以下の出力を考えてみましょう。

Linux Sed フィルター

上記の出力から、コマンド 'echo class7 class9 | を実行します。 sed 's/class/jtp/g'' すべての 'class' は、コマンド 'cat msg.txt | 'を使用して 'jtp' に変換されます。 sed 's/learn/study/g'' すべての「learn」が「study」に変換されました。

線の削除

「d」オプションを使用すると、ファイルから完全な行を削除できます。 「d」オプションを使用してその行の単語を指定するだけで、その行は削除されます。ただし、同じ単語を含む行はすべて削除されることに注意してください。次のように実行されます。

 cat | sed '//d' 

以下のコマンドを考えてみましょう。

 cat msg.txt | sed '/jtp/d' 

上記のコマンドは、「jtp」という単語を含む行を削除します。以下の出力を考えてみましょう。

Linux Sed フィルター

上記の出力から、コマンド 'cat msg.txt | を実行します。 sed '/jtp/d'' 'jtp' という単語を含むすべての行が削除されます。

複数の sed コマンドの使用

「-e」オプションを使用すると、複数の sed コマンドを一度に実行できます。次のようにコマンドを実行することで、複数の sed 操作を実行できます。

 sed -e ' ; ' 

以下のコマンドを考えてみましょう。

 sed -e 's/red/blue/; s/yellow/black/' exm.txt 

上記のコマンドは、ファイル「exm.txt」内の指定されたすべての操作を適用します。以下の出力を考えてみましょう。

Linux Sed フィルター

上記の出力からわかるように、すべての「赤」の単語は「青」に置き換えられ、すべての「黄色」の単語は「黒」に置き換えられます。次のようにコマンドを分離することもできます。

 sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt 

結果は上記のコマンドと同じになります。

ファイルからコマンドを読み取る

sed コマンドをファイルに保存し、任意のファイルに一度に適用できます。これは、次のように「-f」オプションを指定することで実行できます。

 sed -f 

上記のコマンドから、「」は sed コマンド リストを含むファイルです。以下のコマンドを考えてみましょう。

 sed -f SedCommands exm.txt 

上記のコマンドは、「exm.txt」の「SedCommand」ファイルに指定されたすべてのコマンドを適用します。以下の出力を考えてみましょう。

Linux Sed フィルター

上記の出力から、前の例に適用されたコマンドを使用しました。したがって、出力は前の例と同じになります。

文字の置換

感嘆符 (!) を文字列区切り文字として使用できます。たとえば、「/etc/passwd」内の bash シェルを csh シェルに置き換えたいとします。これを行うには、以下のコマンドを実行します。

 sed 's//bin/bash//bin/csh/' /etc/passwd 

以下のコマンドを実行すると、同じ結果が得られます。

 sed 's!/bin/bash!/bin/csh!' /etc/passwd 

sed の制限

sed コマンドの基本的な使用法では、ファイル全体が処理されます。ただし、sed コマンドを制限して任意の行を指定できます。 sed コマンドを制限するには 2 つの方法があります。

  • ラインの範囲。
  • 特定の行に一致するパターン。

次のように番号を指定して行を指定できます。

 sed '3s/Red/Blue/' exm.txt 

上記のコマンドは、3 行目に指定された操作を適用します。以下の出力を考えてみましょう。

Linux Sed フィルター

上記の出力では、3 行目のみが変更されます。

行の範囲を指定することもできます。行の範囲を指定するには、次のようにコマンドを実行します。

 sed '1,3s/Red/Blue/' exm.txt 

上記のコマンドは、1 行目と 3 行目の指定されたテキストを更新します。以下の出力を考えてみましょう。

Linux Sed フィルター

テキストの挿入と追加

「i」および「a」フラグは、ファイルにテキストを挿入および追加するために使用されます。 「i」フラグは文字列の前にテキストを追加し、「a」フラグは文字列の後にテキストを追加するために使用されます。以下のコマンドを考えてみましょう。

 echo 'Another Demo' | sed 'iFirst Demo' 

上記のコマンドは、「Another Demo」というテキストの前にテキストを挿入します。以下の出力を考えてみましょう。

Linux Sed フィルター

テキストを追加するには、次のようにコマンドを実行します。

 echo 'Another Demo' | sed 'aFirst Demo' 

上記のコマンドはテキストを追加します。以下の出力を考えてみましょう。

Linux Sed フィルター

線の変更

「c」フラグは、特定の行を変更するために使用されます。行を変更するには、次のようにコマンドを実行します。

 sed '3cThis is a modified line.' exm.txt 

上記のコマンドは 3 行目を更新します。以下の出力を考えてみましょう。

Linux Sed フィルター

正規表現を使用して、同じパターンを持つ複数の行を更新することもできます。以下のコマンドを考えてみましょう。

 sed '/Apple is /c Line updated.' exm.txt 

上記のコマンドは、文字列「Apple is」を含むすべての行を更新します。以下の出力を考えてみましょう。

Linux Sed フィルター

キャラクターの変身

「y」フラグは文字を変換するために使用されます。文字の変換を特定の出来事に限定することはできません。文字を変換するには、次のようにコマンドを実行します。

 sed 'y/abc/def/' exm.txt 

上記のコマンドは、文字「a」、「b」、「c」を「d」、「e」、「f」に変換します。以下の出力を考えてみましょう。

Linux Sed フィルター

行番号を印刷する

「=」記号は行番号を出力するために使用されます。行番号を出力するには、次のようにコマンドを実行します。

 sed '=' exm.txt 

上記のコマンドは、ファイルの内容の行番号を表示します。以下の出力を考えてみましょう。

Linux Sed フィルター

「-n」オプションの等号は、一致するスクリプトを含む行番号を指定します。以下の出力を考えてみましょう。

 sed -n '/mango/=' exm.txt 

上記のコマンドは、「mango」という単語を含む行番号を表示します。以下の出力を考えてみましょう。

Linux Sed フィルター

上記の出力から、行番号 2 に「mango」という単語が含まれていることがわかります。