HOWTO · PowerShell

PowerShell におけるすべての置換メソッド

この記事では、異なる PowerShell の置換方法を使用して、文字、テキスト、単語を置き換えたり削除したりする方法について説明します。

このページの内容

Windows PowerShell は、多くの他の言語と同様にテキストや文字列を扱うことができます。その貴重な機能の 1つは、Windows PowerShell を使用してファイル内の文字、文字列、またはテキストを置き換えることです。

この記事では、さまざまな PowerShell の置き換えメソッドを使用して、文字、テキスト、単語を置き換えたり削除したりする方法について説明します。

PowerShell における replace() メソッドの紹介

Windows PowerShell を使って文字列内の文字を置き換えることができます。たとえば、この記事全体で使用する文字列型の PowerShell 変数を作成します。

$string = 'hello, world'

文字列内の hello という単語を hi という単語に置き換えて、$string 変数の値を hi, world にしたいと考えています。

それを実行するためには、Windows PowerShell がテキストの特定の部分を見つける必要があり、一度見つかると、そのテキスト部分をユーザーが提供した値で置き換えます。

PowerShell における replace() メソッドの使用

Windows PowerShell で文字列を置き換える最も便利な方法の 1つは、replace() メソッドを使用することです。replace() メソッドは 2つの引数を受け取ります。

  1. 見つける文字列。
  2. 見つけたテキストを置き換える文字列。

以下のように、Windows PowerShell は hello という単語を見つけ出し、それを hi という文字列に置き換えます。このメソッドは最終結果 hi, world を返します。

先ほど作成した $string 変数を例に使いましょう。

コード:

$string.replace('hello', 'hi')

出力:

hi, world

任意の文字に対して replace() メソッドを呼び出して、任意のリテラル文字列を別のもので置き換えることができます。置き換える文字列が見つからない場合、replace() メソッドは何も返しません。

さらに、文字列内のテキストを置き換えるために、文字列を変数に割り当てる必要はありません。代わりに、文字列に対して直接 replace() メソッドを呼び出すことができます。

コード:

'hello world'.replace('hello', 'hi')

PowerShell における文字の削除

別の文字列からテキスト内の文字を削除する必要がある場合もあるかもしれません。その場合は、空の文字列を指定することでそれもできます。

コード:

$string.replace('hello', '')

出力:

, world

PowerShell における複数インスタンスの置き換え

replace() メソッドは文字列データ型の値を返すため、別のインスタンスを置き換えるためには、最後に別の replace() メソッド呼び出しを接続して追加できます。その後、Windows PowerShell は実際の出力に対して replace() メソッドを呼び出します。

コード:

$string.replace('hello', '').replace('world', 'earth')

出力:

, earth

必要に応じて、いくつでも replace() メソッド呼び出しを連鎖させることができますが、複数の文字列を置き換える必要がある場合は、置き換え演算子を使用することを検討すべきです。

PowerShell における置き換え演算子の使用

Windows PowerShell の置き換え演算子を使って、テキストを置き換えることもできます。置き換え演算子は、見つけて置き換える文字列を提供する方法と似ています。

しかし、1つ大きな利点があります。それは、正規表現(regex)を使って一致する文字列を見つけることができる点です。前の例と同様に、置き換え演算子を使って hellohi に置き換えることができます。以下のように示されています。

コード:

$string -replace 'hello', 'hi'

出力:

hi, world

PowerShell における文字の削除

replace() メソッドのように、置き換え演算子を使って文字列から文字を削除することもできます。replace() メソッドとは異なり、置き換え対象の文字列を省略して引数とすることができ、同様の効果を享受できます。

コード:

$string -replace 'hello', ''
$string -replace 'hello'

出力:

, world
, world

PowerShell における複数インスタンスの置き換え

置き換え演算子の使用も連鎖させることができます。

コード:

$string -replace 'hello', 'hi' -replace 'world', 'earth'

出力:

hi, earth

PowerShell における Regex を使用した文字列の置き換え

PowerShell での replace() を使用した文字列の置き換えには限界があります。リテラル文字列のみを使用する制約があります。

ワイルドカードや regex を使用することはできません。中級または上級の操作を行う場合は、置き換え演算子を使用するべきです。

変数で作成された文字列を含むスクリプトがあります。値に関係なく、文字列を goodbye, world に変更したいです。

hello, worldhi, worldgoodbye, world に変換するためには、正規表現を使い、特定のパターンに一致する文字列を正規表現でマッチさせる必要があります。

この例では、hello|hi という表現を使って、正規表現の"または"演算子やパイプ(|)の文字を使用して、どちらの必要な文字列にも一致させることができます。

コード:

'hello, world' -replace 'hello|hi', 'goodbye'
'hi, world' -replace 'hello|hi', 'goodbye'

出力:

goodbye, world
goodbye, world

文字列を見つけるために正規表現を使いこなすことを学べば、PowerShell を使って任意のパターンに一致するワイルドカード文字列を置き換えることができます。

PowerShell における Regex 文字のエスケープ

上記の regex の例では、検索する文字列には特別な regex 文字は含まれていませんでした。しかし、正規表現言語には、ほとんどの文字や数字のように文字通りに解釈されない特定の文字が存在します。

たとえば、文字列内のテキストを置き換える必要があります。その文字列には、かっこや疑問符などのいくつかの特別な regex 文字が含まれています。

次に、[hello] という文字列を goodbye に置き換えようとします。

コード:

PS> '[hello], world' -replace '[hello]', 'goodbye'

出力:

[goodbyegoodbyegoodbyegoodbyegoodbye], wgoodbyergoodbyed

これは私たちが意図していたことではありません。このシナリオは、文字列内で特別な regex 文字を使用している時に発生します([hello])。

この問題を回避するために、これらの特別な文字を各文字の前にバックスラッシュを追加してエスケープするか、Escape() メソッドを使用してエスケープすることができます。以下に、それぞれの特別な文字をバックスラッシュでエスケープした効果を示します。

コード:

'[hello], world' -replace '\[hello\]', 'goodbye'

出力:

goodbye, world

あるいは、regex タイプの Escape() メソッドを使用して、すべての特別な文字を自動的に削除することもできます。

コード:

'[hello], world' -replace ([regex]::Escape('[hello]')), 'goodbye'

出力:

goodbye, world

特別な文字をすべてエスケープするため、Escape() メソッドを使用すべきです。そうすれば、特別な文字を覚える必要もありません。