HIRO's.NET

VB.NET, C#, PowerShell Tipsサイト

 VB.NET, C#, PowerShellを使用しているエンジニアのためのサイト。

 基本的な使用方法から開発で役立つTipsまで幅広く取り扱っています。

HIRO's.NET RSSHIRO's.NET RSS


PowerShellの開発でお困りのことはありませんか?
そんな悩みは当サイトで解決!!

HOME > PowerShell Tips > ファイル操作 Tips メニュー

20.ファイル内の文字列を置換する

 
UPDATE:2008/01/07    
 



PowerShellのファイル操作用コマンドレットはいくつかあるのですが、ファイル内の文字列を特定の文字列へ置換するコマンドレットは存在しません。

-replace演算子を使用して、ファイル内の文字列の置換を行う方法を紹介します。

まず、-replace 演算子の使用方法ですが

-replace "置換前の文字列", "置換後の文字列"

という書式になっています。
-replace演算子は大文字と小文字を区別しません。
大文字と小文字を厳密に区別したい場合には、-creplace演算子を使用してください。

まずは実験をしてみたいと思います。
テキストエディタを開いて、下記のように入力して sample.txt として任意のフォルダへ保存してください。

sample.txt

ABCDE-FGHIJ-KLMNO

次に PowerShellでこのファイルの "FGHIJ" を "XXXXX" に置換して sample_new.txt というファイルへ保存してみたいと思います。

手順としては、
1.ファイルの内容を取得する
2."FGHIJ"を"XXXXX"に置換する
3.sample_new.txtへ保存する(リダイレクト演算子を使用します)
です。

これをPowerShellでは下記のように1行で実行することができます。

List1

PS C:\Work> $(Get-Content "C:\Work\sample.txt") -replace "FGHIJ","XXXXX" > sample_new.txt

先ほどは sample.txt の内容を置換し、sample_new.txt という別のファイルへ保存しました。
今度は、同一のファイルへ保存してみます。

List2のように入力して実行してみてください。

エラーになってしまったのではないでしょうか?
これは、Get-Contentで開いたファイルが閉じられないうちに、置換した結果を保存しようとするためにおこってしまったものです。

List2

PS C:\Work>  $(Get-Content "C:\Work\sample.txt") -replace "FGHIJ","XXXXX" > "C:\Work\sample.txt"

Get-Content : 別のプロセスで使用されているため、プロセスはファイル 'C:\Work\sample.txt' にアクセスできません。
発生場所 行:1 文字:15
+ $(Get-Content <<<< "C:\Work\sample.txt") -replace "FGHIJ","XXXXX" > "C:\Work\sample.txt"

どうでしょうか、sample_new.txtの内容は下記のような結果になりましたか?

sample_new.txt

ABCDE-XXXXX-KLMNO

List3のように2行に分けて行えば、同一のファイルに対して置換した結果を書き込むことができます

List3

PS C:\Work> $file_contents = $(Get-Content "C:\Work\sample.txt") -replace "FGHIJ","XXXXX"
PS C:\Work> $file_contents > "C:\Work\sample.txt"

上記を踏まえて、Replace-Content という関数を作成してみました。

この関数を実行すると、文字列を置換し上書き保存を行います。
重要なファイルへの置換を行う場合には注意して使用してください。

確認メッセージの表示や、バックアップを取る機能を付加するとより実用的になるかと思います。

Replace-Content.ps1

#===============================================================================
# Replace-Content: ファイル内の指定文字列を置換する
# Param:
# $filepath : ファイルパス
# $rep1 : 置換対象文字列
# $rep2 : 置換後の文字列
#
# 使用例
# #sample.txtのファイル内の"AAA"という文字列を"BBB"に置換する
# Get-Content "C:\Work\sample.txt" "AAA" "BBB"
#
# copyright HIRO's.NET(http://hiro.wankuma.com/)
#===============================================================================
function global:Replace-Content
{
Param([string]$filepath, [string]$rep1, [string]$rep2)
if ( $(test-path $filepath) -ne $True )
{
Write-Error "存在しないパスです"
return
}
$file_contents = $(Get-Content $filepath) -replace $rep1, $rep2
$file_contents > $filepath
}

使用方法は下記の通りです

List4

PS C:\Work> Replace-Content "C:\Work\sample.txt" "AAA" "BBB"