[FAQ CENTER トップ]
[Powershell FAQ トップへ]



【Powershell】含まれない文字列を grep 検索し見つかったら置換するサンプル



更新日:2019/09/27


文字列が含まれないgrepで処理


サブフォルダを再帰的に grep 検索し、指定した文字が含まれないファイルは指定した文字で置換するサンプルコードです。
例えばあるフォルダ以下に大量にファイルが存在し、各ファイルには必ずあるタグが設定されている必要があるとします。
もしタグが存在しない場合は、指定した文字列で置換することにより、文字列を設定しようということです。

以下の例ではc:\testdirディレクトリ以下を再帰的に検索しています。
もしファイルに"ABCXYZ"という文字が含まれない場合は、以下の置換処理を行います。

置換対象文字列:"STRING_FROM"
置換文字列:"STRING_TO"

(*)この例では文字コードを考慮していません。本格的には-Encoding により使用する文字コードを考慮する必要があります。


#再帰的に検索するフォルダ
$path = "c:\testdir\"

#検索する"含まれない"文字列
$notfind_str = "ABCXYZ"

#置換対象文字列
$from_str = "STRING_FROM"

#置換後の文字列
$to_str = "STRING_TO"


Get-Childitem -Path $Path -Recurse -Include *.html | ?{
Select-String -InputObject (Get-Content ($_.FullName )) -Pattern $notfind_str -NotMatch
} | %{
write-host $_.FullName
$file = $_
$content = Get-Content ($_.FullName)

if( [ string]::IsNullorEmpty($content))
{
write-host "error"
}

#使用するときは以下コメントを除去してください。ファイルの内容を書き換えるので十分注意してください。
#Set-Content -Encoding String $_.FullName ($content -replace $from_str, $to_str)
}



Linux 系コマンドで実現する


gow や cygwin のlinux互換コマンドで実現することが可能です。以下はサンプルです。


grep -L viewport -R c:\\testdir --include=*.html | C:\Gow\bin\xargs c:\cygwin\bin\sed -i 's/STRING_FROM/STRING_TO/g'



(*)gow のsed ではsedxxxxxのような一時ファイルが残ってしまいました。-i オプションで一時ファイルを生成しますが、なぜかこのファイルが削除されずに残存するようです。cygwinのsedではこの問題は発生しませんでした。






[Powershell FAQ トップへ]
[FAQ CENTER トップ]


本サイト内掲載されている情報は、著作権法により保護されています。いかなる場合でも権利者の許可なくコピー、配布することはできません。 このページはリンクフリーです。(このページへの直接リンクも可能です。) Copyright(c) tooljp.com 2007-2018