Sed と正規表現を使用して複雑な文字列を検索して置換する
テキストファイルを操作する場合、1つ以上のファイルのテキスト文字列を識別して置き換える必要があることがよくあります。
sed
はストリームエディタです。ファイルやパイプラインなどの入力ストリームに対して基本的なテキスト操作を実行できます。sed
を使用して、単語や行の検索、検索、置換、およびそれらの挿入と削除を行うことができます。
基本および拡張の正規表現
がサポートされているため、複雑なパターンに一致させることができます。この記事では、sed
を使用して文字列を検索および置換する方法について説明します。また、再帰検索と置換の使用方法についても説明します。
Bash で sed
を使用して文字列を検索して置換する
sed
にはさまざまなバージョンがあり、それぞれに機能があります。
Linux ディストリビューションには、デフォルトで GNU sed
がプリインストールされていますが、MacOS は BSD バージョンを利用しています。GNU
バージョンを使用します。
この構文は、テキストを検索して sed
に置き換えるために使用されます。
sed -e 's/Search_Regex/substitution/g' Filename
上記の構文で使用されている定義は次のとおりです。
-e
は、デフォルトで標準出力に書き込まれる sed の出力です。このパラメータは、現在の場所にあるファイルを編集するようにsed
に指示します。拡張子が定義されている場合は、置換ファイルが生成されます。///
は区切り文字として機能する文字です。ほとんどの人はスラッシュ(/
)文字を使用しますが、どの文字でもかまいません。Search_Regex
は何かを検索するためのものです。regex
または通常の文字列を使用します。substitution
は、置換する文字列として使用されます。g
はグローバル置換のフラグです。sed
はデフォルトでファイルを 1 行ずつ読み取り、各行で最初に出現するSearch_Regex
のみを変更します。置換フラグが設定されると、すべてのインスタンスが置換されます。Filename
は、コマンドを実行する必要のあるファイルの名前です。
sed
コマンドを使用してファイル内のテキストを検索および置換するために一般的に使用されるパラメーターとフラグを見てみましょう。デモ用に作成したサンプルファイル、つまり live.txt
を使用します。
live.txt
Omicron is the endgame of Covid and Omicron 9876
g
フラグを無視すると、各行の検索文字列の最初のインスタンスのみが置き換えられます。
$ sed -e 's/endgame/infinitywar/' live.txt
出力:
Omicron is the infinitywar of Covid and Omicron 9876
sed
は、検索パターンのすべての出現箇所をグローバル置換フラグに置き換えます。
$ sed -e 's/Omicron/thanos/g' live.txt
出力:
thanos is the endgame of Covid and thanos 9876
お気づきかもしれませんが、文字列 Omicron
は thanos
に置き換えられています。
Bash の文字列内の区切り文字/
を検索して置換する
区切り文字/
を含む文字列を検出して置き換える場合は、バックスラッシュ\
を使用してスラッシュをエスケープする必要があります。たとえば、/bin/bash
を/usr/bin/zsh
に置き換えるには、次を使用します。
$ sed -e 's/\/bin\/bash/\/usr\/bin\/zsh/g' live.txt
出力:
Omicron is the endgame of Covid and Omicron 9876
縦棒を使ってわかりやすくしましょう|
またはコロン:
。ただし、他の文字で十分です。
$ sed -e 's|/bin/bash|/usr/bin/zsh|g' live.txt
出力:
Omicron is the endgame of Covid and Omicron 9876
ご覧のとおり、結果は前の結果と同じです。
Bash ですべての数字を見つけて文字列番号に置き換える
正規表現では、4つの数値すべてを検索して、それらを文字列番号に置き換えることもできます。例えば:
$ sed -e 's/\b[0-9]\{4\}\b/number/g' live.txt
出力:
Omicron is the endgame of Covid, and Omicron number
ご覧のとおり、9876
は number
文字列に置き換えられています。
最後になりましたが、sed
を使用してファイルを編集するときは、常にバックアップを作成する必要があります。これを実現するには、-i
オプションにバックアップファイルの拡張子を付けます。
たとえば、live.txt
を編集して、元のファイルを live.txt
として保存します。bak
を利用する場合は、次の方法で行います。
$ sed -i.bak 's/Omicron/thanos/g' live.txt
ls
コマンドを使用してファイルを一覧表示し、バックアップが作成されたことを確認します。
$ ls
出力:
live.txt
live.txt.bak
最初は複雑に見えるかもしれませんが、sed
を使用してファイル内のテキストを見つけて変更するのは比較的簡単です。