背景: .mp4 ビデオのファイル名を小文字に変更し、特殊文字とスペースを置き換えました。ここで、.txt ファイル内の関連付けられた URL を同様の方法で変更する必要があります。ビデオを参照するこれらの URL を多数含むテキスト ファイルが多数あります。
問題: どのテキスト ファイルでも、"flashplayer" と "/flashplayer" の間のすべての文字列の特殊文字を置き換える必要がありますが、flashplayer タグ以外は何も変更してはなりません。
"flashplayer" と "/flashplayer" の間の文字列を選択して置換する方法がわかりません。
サンプル文字列:
(flashplayer width="640" height="480" position="1")file=/wiki/data/media/sales/a/ö 2.mp4&config=/wiki/lib/plugins/flashplayer/config_video.xml&start=0(/flashplayer)
このサンプルはテキストファイル (DokuWiki ページ) に含まれています。() はタグ文字を意味します。
出力文字列の例:
(flashplayer width="640" height="480" position="1")file=/wiki/data/media/sales/a/oe_2.mp4&config=/wiki/lib/plugins/flashplayer/config_video.xml&start=0(/flashplayer)
rename-item での置換は次のようになります。
- ä = ae
- ö = オエ
- ü = ue
- ' ' = '_'
更新: スクリプトは次のようになります。
# vars (User-Eingabe)
$source = "d:\here\name\test\pages"
$search = '(\<flashplayer.*?\>file\=/wiki/87sj38d/media)(.*?)(\<\/flashplayer\>)'
$a = 1
Write-Host "`nSource:`t $source`n"
# replace special characters
gci $source -r -Filter *.txt | ForEach-Object {
$text = Get-Content $_.FullName | ForEach-Object {
if($_ -match $search) {
$_ -replace [Regex]::Escape($Matches[2]), ($Matches[2] -replace'ö', 'oe' -replace'ä', 'ae' -replace'ü', 'ue' -replace'\s', '_' )
$output = $Matches[2]
$tags = $a++
Write-Host "`nTag $tags : $output"
} else {
$_
}
}
$text | Set-Content $_.FullName
}
テキストファイルには、次のようなコード行が含まれています。
{{backlinks>path:product:description:kennwort_aendern}}
スクリプトは、このコード行を削除した場合にのみ機能します。それ以外の場合、flashplayer タグ間の文字列は同じままです。紛らわしいことに、交換品は動作する場合と動作しない場合があります。flashplayer タグ間の文字列には、多くの特殊文字を含めることができます。サンプル文字列を参照してください:
<flashplayer_width="640"_height="480"_position="1">file=/wiki/87sj38d/media/ab/any/test/1001_Grundlagen Kennwort ändern.mp4&image=/wiki/87sj38d/media/ab/any/test/1001_Grundlagen Kennwort ändern.jpg&config=/wiki/lib/plugins/flashplayer/config_video.xml&start=0</flashplayer>
Write-Host $output はすべての文字列を正しく表示しますが、置換は正しく機能しません。