
テキストファイルを操作するときは、多くの場合、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チュートリアルにアクセスしてください。
ご質問やご意見がございましたら、お気軽にコメントをお寄せください。