テキストファイルを操作するとき、多くの場合、一つ以上のファイル内のテキストの文字列を検索および置換する必要があります。
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
お気づきかもしれませんが、foofoobar文字列の中にある部分文字列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