A day with Scandale - Harmonie Collection - Spring / Summer 2013
目次:
テキストファイルを操作する場合、多くの場合、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
再帰的な検索と置換
文字列を含むファイルをディレクトリで再帰的に検索し、すべてのファイルの文字列を置換したい場合があります。 これを行うには、
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チュートリアルをご覧ください。 ご質問やフィードバックがある場合は、お気軽にコメントをお寄せください。