アンドロイド

sedを使用してファイル内の文字列を検索および置換する方法

A day with Scandale - Harmonie Collection - Spring / Summer 2013

A day with Scandale - Harmonie Collection - Spring / Summer 2013

目次:

Anonim

テキストファイルを操作する場合、多くの場合、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 にその場でファイルを編集するよう指示します。 拡張子が指定されている場合(ex -i.bakなど)、元のファイルのバックアップが作成されます。 s 代替コマンド。おそらくsedで最も使用されるコマンドです。 / / / -区切り文字。 任意の文字を使用できますが、通常はスラッシュ( / )文字が使用されます。 SEARCH_REGEX 検索する通常の文字列または正規表現。 REPLACEMENT 置換文字列。 g グローバル置換フラグ。 デフォルトでは、 sed はファイルを1行 SEARCH_REGEX 、行で最初に発生する SEARCH_REGEX のみを変更します。 置換フラグを指定すると、すべての出現が置換されます。 INPUTFILE コマンドを実行するファイルの名前。

引数を引用符で囲んで、シェルのメタ文字が展開しないようにすることをお勧めします。

sed コマンドを使用してファイル内のテキストを検索し、最も一般的に使用されるいくつかのオプションとフラグで置き換える方法の例を見てみましょう。

デモンストレーションのために、次のファイルを使用します。

file.txt

123 Foo foo foo foo /bin/bash Ubuntu foobar 456

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

お気づきかもしれませんが、前の例では、 foobar ストリング内のサブストリング foo も置換されます。 これが望ましい動作でない場合は、検索文字列の両端で単語境界式( \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

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 置き換えるには、 number ようにします。

sed -i 's/\b\{3}\b/number/g' file.txt

number Foo foo foo foo /bin/bash demo foobar number

sedのもう1つの便利な機能は、一致したパターンに対応するアンパサンド文字 & を使用できることです。 文字は複数回使用できます。

たとえば、各3桁の数字の周りに中括弧 {} を追加する場合は、次のように入力します。

sed -i 's/\b\{3}\b/{&}/g' file.txt

{123} Foo foo foo foo /bin/bash demo foobar {456}

最後に大事なことを言い sed ましたが、 sed ファイルを編集するときは常にバックアップを作成することをお勧めします。 これを行うには、 -i オプションの拡張子を指定するだけです。 たとえば、 file.txt を編集し、元のファイルを file.txt.bak として保存するには、次を使用します。

sed -i.bak 's/foo/linux/g' file.txt

ls

file.txt file.txt.bak

再帰的な検索と置換

文字列を含むファイルをディレクトリで再帰的に検索し、すべてのファイルの文字列を置換したい場合があります。 これを行うには、 find grep などのコマンドを使用して、ディレクトリ内のファイルを再帰的に検索し、ファイル名を sed パイプします。

次のコマンドは、現在の作業ディレクトリ内のファイルを再帰的に検索し、ファイル名を sed 渡します。

find. -type f -exec sed -i 's/foo/bar/g' {} +

名前にスペースが含まれるファイルの問題を回避するには、 find にファイル名を出力し、その後にヌル文字を続けて出力を xargs -0 を使用して sed パイプする -print0 オプションを使用します。

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'

別のオプションは、 grep コマンドを使用して、検索パターンを含むすべてのファイルを再帰的に検索し、ファイル名を sed パイプすることです。

grep -rlZ 'foo'. | xargs -0 sed -i.bak 's/foo/bar/g'

結論

複雑で複雑に見えるかもしれませんが、最初はファイル内のテキストを検索して sed 置き換えるのは非常に簡単です。

sed コマンド、オプション、およびフラグの詳細については、GNU sedマニュアルおよびGrymoire sedチュートリアルをご覧ください。 ご質問やフィードバックがある場合は、お気軽にコメントをお寄せください。

sedターミナル