Sed 代替コマンド: 基本、後方参照、およびファイル編集
Sed は「Stream EDitor」の略です。これは、世の中のすべての Linux および Unix ベースのオペレーティング システムにデフォルトでインストールされる無料のオープン ソース ユーティリティです。ファイルに対してテキスト操作を実行しますが、パイプラインの一部として使用することもでき、正規表現の使用をサポートします。このチュートリアルでは、sed replace コマンドの基本を学びます。
このチュートリアルでは次のことを学習します。
- sed「substitute」コマンドの基本構文
- 後方参照の使用方法
- 最もよく使用される「代替」コマンド フラグのいくつか
- ファイルをその場で変更し、必要に応じてそのバックアップを作成する方法
「代替」コマンド
Substitute はおそらく最もよく知られ、使用されている sed コマンドです。これは、ファイル内のテキスト パターンを非対話的な方法で置き換えるのに役立ちます。その使用方法を学びたい場合、最初に行うべきことは、その構文を確認することです。例を見てみましょう: ジョン ロナルド リューエル トールキンが書いた有名な着信詩を含む lotr.txt
というファイルがあるとします。
Three Rings for the Elven-kings under the sky,
Seven for the Dwarf-lords in their halls of stone,
Nine for Mortal Men doomed to die,
One for the Dark Lord on his dark throne
In the Land of Mordor where the Shadows lie.
One Ring to rule them all, One Ring to find them,
One Ring to bring them all, and in the darkness bind them,
In the Land of Mordor where the Shadows lie.
ここで、本格的なテキスト エディタ (おそらくシェル スクリプト) を使用せずに、出現するすべての単語「Ring 」を単語「foo 」に置き換えたいと考えてみましょう。 sed
を使用してそのようなアクションを実行するには、次のコマンドを実行します。
$ sed 's/Ring/foo/g' lotr.txt
コマンドを起動するとすぐに、ファイルの処理された内容が標準出力に表示されます。
Three foos for the Elven-kings under the sky,
Seven for the Dwarf-lords in their halls of stone,
Nine for Mortal Men doomed to die,
One for the Dark Lord on his dark throne
In the Land of Mordor where the Shadows lie.
One foo to rule them all, One foo to find them,
One foo to bring them all, and in the darkness bind them,
In the Land of Mordor where the Shadows lie.
予想どおり、「Ring 」という単語が出現するたびに「foo 」に置き換えられました。ただし、元のファイルは変更されません。これは、デフォルトで sed が単に標準出力に書き込むためです。上の例で行ったことを分析してみましょう。 sed
ユーティリティは、単一の文字で表される一連のコマンドを受け入れ、場合によってはある種の引数を受け入れます。この場合、s
コマンド (代替) を使用しました。コマンドの構文は次のとおりです。
s/regexp/replacement/flags
ユーティリティは、指定されたファイル (またはストリーム) 内の指定された正規表現 (「regexp」) との照合を試みます。式の各一致は「置換」に置き換えられます。
後方参照の使用
正規表現と置換の両方の一部として後方参照を使用できます。これにより、エスケープされた括弧で囲まれた一致した正規表現のサブ部分を参照でき、キャプチャ グループが作成されます。例を見てみましょう:
$ sed 's/\([a-z]\)\1\([ ,/]\)/\1\2/g' lotr.txt
上の例では、次の正規表現を指定しました。
\([a-z]\)\1\([ ,.]\)
最初の [a-z]
パターンは、「a 」から「z 」までの任意の ASCII 文字と一致します。ご覧のとおり、エスケープされた括弧の間に記述されています。これにより、後で \1
を使用して一致したテキストを参照できるようにするキャプチャ グループが作成されます。ここで、「1 」は最初のキャプチャ グループを意味します。
これは、「任意の二重文字」と一致させるためにその直後に行ったことです。最後に、 [,.]
式を含む別のキャプチャ グループを定義しました。この (部分) 式は、「スペース」、「カンマ」、または「ドット」に一致します。ご想像のとおり、\2
を使用して 2 番目のキャプチャ グループを参照できます。したがって、式全体は、「スペース、カンマ、またはドットが後に続く任意の 2 文字」を意味します。
コマンドの「置換」部分では、再度後方参照を使用して、一致したパターン全体を、最初のキャプチャ グループに含まれる式に一致する文字の 1 つの出現に置き換え、続いて 2 番目のキャプチャ グループに含まれる式の一致を置き換えました。 1 つ (ここでもスペース、カンマ、またはドット)。
また、コマンドの「置換」部分の後に g
文字を使用していることにも注目してください。これは、行内のすべての一致を代わりに置換するフラグです。最初のものだけです (後者はデフォルトの sed 動作です)。次のセクションでは、フラグについて具体的に説明します。このコマンドの結果、単語の末尾にある二重文字は単一の文字に置き換えられます。結果は次のとおりです。
Thre Rings for the Elven-kings under the sky,
Seven for the Dwarf-lords in their halls of stone,
Nine for Mortal Men doomed to die,
One for the Dark Lord on his dark throne
In the Land of Mordor where the Shadows lie.
One Ring to rule them al, One Ring to find them,
One Ring to bring them al, and in the darknes bind them,
In the Land of Mordor where the Shadows lie.
コマンドの「置換」部分では、エスケープされていない &
文字も使用できます。これは正規表現一致全体を参照します。
Sed「代替」コマンドフラグ
s
コマンドを使用する場合、動作を変更できる一連のフラグを指定できます。それらのいくつかとその効果を見てみましょう。
「g」フラグ
g
フラグは、最初の 1 つだけではなく、 行内の正規表現のすべての一致が置換されるように、sed の「substitute」コマンドの動作を変更します。一例として、指輪詩の 6 行目を見てみましょう。「指輪」という言葉が 2 回出てきます。最初の例と同様に、g
フラグを使用せずに「substitute」コマンドを実行してみましょう。
$ sed 's/Ring/foo/' lotr.txt
以下を取得します。
One foo to rule them all, One Ring to find them,
ご覧のとおり、最初に出現した「Ring」という単語のみが「foo」に置き換えられています。代わりに g
フラグを使用すると、両方の出現が置換の影響を受けます。
「i」フラグ
i
フラグにより、s
コマンドで使用される正規表現の大文字と小文字が区別されなくなります。たとえば、次のコマンドの正規表現は、「ring」が指定されている場合でも「Ring」と一致します。
$ sed 's/ring/foo/i' lotr.txt
数値をフラグとして使用する
数値がフラグとして使用される場合、sed s
コマンドの動作が変更され、行内の正規表現の n 個の一致のみが「置換」によって置き換えられます (sed は行ベースで動作します)。実行すると:
$ sed 's/Ring/foo/1' lotr.txt
次の出力が得られます。
Three foos for the Elven-kings under the sky,
Seven for the Dwarf-lords in their halls of stone,
Nine for Mortal Men doomed to die,
One for the Dark Lord on his dark throne
In the Land of Mordor where the Shadows lie.
One foo to rule them all, One Ring to find them,
One foo to bring them all, and in the darkness bind them,
In the Land of Mordor where the Shadows lie.
「p」フラグ
p
フラグは、置換が実行された行を出力するように sed の動作を変更します。これは、sed を -n
オプションとともに使用してサイレントにする場合に特に便利です。この 2 つを組み合わせると、変更された行のみが出力されます。
$ sed -n 's/Ring/foo/gp' lotr.txt
コマンドは以下を返します:
Three foos for the Elven-kings under the sky,
One foo to rule them all, One foo to find them,
One foo to bring them all, and in the darkness bind them,
上記のフラグは、sed「substitute」コマンドで使用できるフラグの一部にすぎません。完全かつ詳細なリストは、「s」コマンドの公式ドキュメントを読むことで見つけることができます。
テキストをその場で置換する
すでに述べたように、sed "substitute" コマンドの出力は標準出力に出力されるため、元のファイルは変更されません。ファイルの内容をその場で変更したい場合は、-i
オプション (--in-place
の略) を指定して sed を呼び出すだけです。 、例:
$ sed -i 's/Ring/foo/g' lotr.txt
オプションの引数として サフィックス を指定することもできます。これを実行すると、指定したサフィックスが付いたバックアップ ファイルが作成されます。たとえば、次を実行するとします。
$ sed --in-place='.bk' 's/Ring/foo/g' lotr.txt
上記のコマンドを起動すると、ターゲット ファイルがその場で変更されます。ただし、元のコンテンツは lotr.txt.bk
というバックアップ ファイルに保存されます。
結論
この記事では、sed の「substitute」コマンドの基本を学びました。コマンドの構文、正規表現と後方参照の使用方法について説明しました。また、正規表現の大文字と小文字を区別しないようにする i
や、一致するすべての正規表現を置き換える g
など、「s」コマンドで使用できるフラグもいくつか確認しました。一行。最後に、ファイルをその場で変更し、必要に応じて変更が書き込まれる前にそのバックアップを作成する方法を説明しました。