テキストファイルを操作するときは、多くの場合、1つ以上のファイル内のテキストの文字列を見つけて置き換える必要があります。
sed s tream ed itor。ファイルやパイプラインなどの入力ストリームに対して基本的なテキスト操作を実行できます。 sedを使用 、単語や行を検索、検索、置換、挿入、削除できます。複雑なパターンに一致させることができる基本的な正規表現と拡張正規表現をサポートしています。
この記事では、文字列を検索してsedに置き換える方法について説明します。 。また、再帰的な検索と置換を実行する方法も示します。
sedに置き換えます #
sedにはいくつかのバージョンがあります 、それらの間にいくつかの機能上の違いがあります。 macOSはBSDバージョンを使用しますが、ほとんどのLinuxディストリビューションにはGNU sedが付属しています デフォルトでプリインストールされています。 GNUバージョンを使用します。
sedを使用してテキストを検索および置換する一般的な形式 次の形式を取ります:
sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
-
-i-デフォルトでは、sedその出力を標準出力に書き込みます。このオプションは、sedに通知します その場でファイルを編集します。拡張子が指定されている場合(例:-i.bak)、元のファイルのバックアップが作成されます。 -
s-代替コマンド、おそらくsedで最も使用されているコマンド。 -
/ / /-区切り文字。任意の文字にすることができますが、通常はスラッシュ(/)文字が使用されます。 -
SEARCH_REGEX-検索する通常の文字列または正規表現。 REPLACEMENT-置換文字列。-
g-グローバル置換フラグ。デフォルトでは、sedファイルを1行ずつ読み取り、SEARCH_REGEXの最初の出現のみを変更します 一列に。置換フラグが指定されると、すべてのオカレンスが置換されます。 -
INPUTFILE-コマンドを実行するファイルの名前。
シェルのメタ文字が展開されないように、引数を引用符で囲むことをお勧めします。
sedの使い方を見てみましょう ファイル内のテキストを検索して、最も一般的に使用されるオプションとフラグのいくつかに置き換えるコマンド。
デモンストレーションの目的で、次のファイルを使用します:
file.txt123 Foo foo foo
foo /bin/bash Ubuntu foobar 456
gの場合 フラグは省略され、各行の検索文字列の最初のインスタンスのみが置き換えられます:
sed -i 's/foo/linux/' file.txt 123 Foo linux foo
linux /bin/bash Ubuntu foobar 456
グローバル置換フラグsed 検索パターンのすべての出現箇所を置き換えます:
sed -i 's/foo/linux/g' file.txt 123 Foo linux linux
linux /bin/bash Ubuntu linuxbar 456
お気づきかもしれませんが、サブストリングfoo foobar内 前の例では、文字列も置き換えられています。これが望ましくない動作である場合は、単語境界式(\b)を使用してください )検索文字列の両端。これにより、部分的な単語が一致しなくなります。
sed -i 's/\bfoo\b/linux/g' file.txt 123 Foo linux linux
linux /bin/bash Ubuntu foobar 456
パターンマッチの大文字と小文字を区別しないようにするには、Iを使用します 国旗。以下の例では、両方のgを使用しています。 およびI フラグ:
sed -i 's/foo/linux/gI' file.txt 123 linux linux linux
linux /bin/bash Ubuntu linuxbar 456
区切り文字(/を含む文字列を検索して置換する場合 )バックスラッシュ(\)を使用する必要があります )スラッシュをエスケープします。たとえば、/bin/bashを置き換える /usr/bin/zshを使用 使用します
sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt
より簡単で読みやすいオプションは、別の区切り文字を使用することです。ほとんどの人は垂直バーを使用します(| )またはコロン(: )ただし、他の文字を使用できます:
sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt 123 Foo foo foo
foo /usr/bin/zsh Ubuntu foobar 456
正規表現を使用することもできます。たとえば、3桁の数字をすべて検索し、それらを文字列numberに置き換えるには 使用するもの:
sed -i 's/\b[0-9]\{3\}\b/number/g' file.txt
number Foo foo foo
foo /bin/bash demo foobar number
sedのもう1つの便利な機能は、アンパサンド文字&を使用できることです。 一致したパターンに対応します。キャラクターは複数回使用できます。
たとえば、中かっこを追加する場合は{} 各3桁の数字の周りに、次のように入力します:
sed -i 's/\b[0-9]\{3\}\b/{&}/g' file.txt
{123} Foo foo foo
foo /bin/bash demo foobar {456}
最後になりましたが、sedでファイルを編集するときは、常にバックアップを作成することをお勧めします。 。これを行うには、バックアップファイルの拡張子を-iに指定するだけです。 オプション。たとえば、file.txtを編集するには 元のファイルをfile.txt.bakとして保存します 使用するもの:
sed -i.bak 's/foo/linux/g' file.txt
バックアップが作成されていることを確認するには、lsを使用してファイルを一覧表示します コマンド:
ls file.txt file.txt.bak
再帰的な検索と置換#
文字列を含むファイルをディレクトリで再帰的に検索し、すべてのファイルの文字列を置き換えたい場合があります。これは、findなどのコマンドを使用して実行できます またはgrep ディレクトリ内のファイルを再帰的に検索し、ファイル名をsedにパイプします 。
次のコマンドは、現在の作業ディレクトリ内のファイルを再帰的に検索し、ファイル名をsedに渡します。 。
find . -type f -exec sed -i 's/foo/bar/g' {} +
名前にスペースが含まれるファイルの問題を回避するには、-print0を使用します findに指示するオプション ファイル名の後にヌル文字を出力し、出力をsedにパイプします。 xargs -0を使用する :
find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
ディレクトリを除外するには、-not -pathを使用します オプション。たとえば、ローカルgitリポジトリの文字列を置き換えて、ドット(.で始まるすべてのファイルを除外する場合) )、使用:
find . -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g' 特定の拡張子を持つファイルのテキストのみを検索して置換する場合は、次を使用します。
find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'
もう1つのオプションは、grepを使用することです。 検索パターンを含むすべてのファイルを再帰的に検索し、ファイル名をsedにパイプするコマンド :
grep -rlZ 'foo' . | xargs -0 sed -i.bak 's/foo/bar/g' 結論#
複雑で複雑に見えるかもしれませんが、最初は、ファイル内のテキストを検索してsedに置き換えます。 とてもシンプルです。
sedの詳細については コマンド、オプション、およびフラグについては、GNUsedマニュアルおよびGrymoiresedチュートリアルにアクセスしてください。
ご質問やご意見がございましたら、お気軽にコメントをお寄せください。