テキストファイルを操作するとき、多くの場合、一つ以上のファイル内のテキストの文字列を検索および置換する必要があります。
sed
はストリームエディタです。 に行うことができテキストの操作ファイル入力ストリームなどのパイプライン Div id=”19d58b9d24″>
を使用すると、単語や行の検索、検索、置換、挿入、削除を行うことができます。 対応して基本と拡張正規表現できるように合わせ複雑なパターン,
この記事では、文字列を検索してsed
に置き換える方法について説明します。 また、再帰的な検索と置換を実行する方法も示します。
文字列を検索して置き換えますsed#
sed
にはいくつかのバージョンがあり、それらの間にいくつかの機能の違いがあります。 macOSはBSDバージョンを使用していますが、ほとんどのLinuxディストリビューションにはGNUsed
がデフォルトでプリインストールされています。 GNUバージョンを使用します。,
sed
を使用してテキストを検索および置換する一般的な形式は、次の形式をとります。
sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
-i
-デフォルトでは、sed
このオプションは、sed
にファイルを編集するように指示します。 拡張子が指定されている場合(例:i.bak)、元のファイルのバックアップが作成されます。li>s
-代替コマンド、おそらくsedで最も使用されるコマンドです。/ / /
-区切り文字です。, 任意の文字にすることができますが、通常はスラッシュ(/
)文字が使用されます。SEARCH_REGEX
-検索する通常の文字列または正規表現。REPLACEMENT
-置換文字列。g
-グローバル置換フラグ。 デフォルトでは、sed
はファイルを行ごとに読み取り、行の最初のSEARCH_REGEX
のみを変更します。 置換フラグが指定されると、すべての出現が置換されます。,INPUTFILE
-コマンドを実行するファイルの名前。
シェルのメタ文字が展開されないように、引数を引用符で囲むことをお勧めします。
sed
コマンドを使用して、ファイル内のテキストを最も一般的に使用されるオプションとフラグで検索して置き換える方法を見てみましょう。
デモンストレーションのために、次のファイルを使用します。
123 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 linuxlinux /bin/bash Ubuntu linuxbar 456
お気づきかもしれませんが、foo
foobar
文字列の中にある部分文字列foo
も前の例で置き換えられます。, これが望ましい動作でない場合は、検索文字列の両端で単語境界式(\b
)を使用します。 これは部分的な単語が一致しないことを保証します。
sed -i 's/\bfoo\b/linux/g' file.txt
123 Foo linux linuxlinux /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\{3\}\b/number/g' file.txt
number Foo foo foo foo /bin/bash demo foobar number
sedのもう一つの便利な機能は、一致したパターンに対応するアンパサンド文字&
を使用できることです。, 文字は複数回使用することができます。
たとえば、中括弧を追加する場合{}
各3桁の数字の周りには、次のように入力します。
sed -i 's/\b\{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
:
find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
ディレクトリを除外するには、-not -path
オプションを使用します。,ドット(.
)でアーティングすると、次のようになります。
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チュートリアルを参照してください。
Leave a Reply