1

背景: .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 はすべての文字列を正しく表示しますが、置換は正しく機能しません。

4

2 に答える 2

2

このようなものを試すことができます。テキストファイルごとに、すべてのflashplayer行の特殊文字を置き換えます。

Get-ChildItem -Path "c:\FolderOfTextfiles" -Filter *.txt | ForEach-Object {

    $text = Get-Content $_.FullName | ForEach-Object {
        if($_ -match '(?<=\(flashplayer.*?\))(.*?)(?=\(/flashplayer\))') {
            $_ -replace [Regex]::Escape($Matches[1]), ($Matches[1] -replace'ö', 'oe' -replace 'ä', 'ae' -replace 'ü', 'ue' -replace '\s', '_' )
        } else {
            $_
        }
    }

    $text | Set-Content $_.FullName

}

更新: テキストに改行が含まれている場合は、このグローバルな複数行の正規表現マッチング アプローチを試すことができます。

$s = @'
<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>
<flashplayer_width="640"_height="480"_position="1">file=/wiki/87sj38f/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>
'@

#Read text as single string
#PS 3.0+
#$s = Get-Content .\test.txt -Raw

#PS 2.0
#$s = Get-Content .\test.txt | Out-String

$s = [regex]::Replace($s, '(?s)(?<=<flashplayer.*?>file=/wiki/87sj38d/media).*?(?=</flashplayer>)', { 
    param([System.Text.RegularExpressions.Match]$m)
    $m.Value -replace 'ö', 'oe' -replace 'ä', 'ae' -replace 'ü', 'ue' -replace ' ', '_'
})

$s    

#Save
#$s | Set-Content .\test.txt

現在のPowerShellバージョンで$1使用する場合、AFAIKは変更できないため(キャプチャされたグループ)、これはもう少し複雑なソリューションです。-replace 'pattern', '$1'誰かがより良い解決策を持っている場合は、共有してください:)

于 2014-07-23T13:10:05.390 に答える
0

ここに、言及された文字を置き換えるために使用できるコマンドがあります。テキストファイルの場所に応じてファイルパスを変更する必要があります。Replace-FileString.ps1 が使用されます。http://windowsitpro.com/scripting/replaceing-strings-files-using-powershell

./Replace-FileString  -Pattern '(flashplayer)(.*)ä(.*)(\/flashplayer)'  -Replacement '$1$2ae$3$4'  -Path C:\test\*.txt  -Overwrite
./Replace-FileString  -Pattern '(flashplayer)(.*)ö(.*)(\/flashplayer)'  -Replacement '$1$2oe$3$4'  -Path C:\test\*.txt  -Overwrite
./Replace-FileString  -Pattern '(flashplayer)(.*)ü(.*)(\/flashplayer)'  -Replacement '$1$2ue$3$4'  -Path C:\test\*.txt  -Overwrite
./Replace-FileString  -Pattern '(flashplayer)(.*) (.*)(\/flashplayer)'  -Replacement '$1$2_$3$4'  -Path C:\test\*.txt  -Overwrite

すべてのテキストファイルを開いて書き込みます (何も変更しない場合でも)。文字列 "flashplayer" と "/flashplayer" の間に "ä"、"ö"、"ü"、または " " がある行のみが変更されます。

于 2014-07-23T13:07:35.907 に答える