Замена «умных цитат» в powershell - PullRequest
4 голосов
/ 06 августа 2011

Я немного застрял в одной простой проблеме.Я пытаюсь удалить необычные цитаты из набора текстовых файлов.У меня есть следующий скрипт, где я пробую несколько различных методов замены, но без результатов.

Вот пример, который загружает данные из github и пытается конвертировать.

$srcUrl="https://raw.github.com/gist/1129778/d4d899088ce7da19c12d822a711ab24e457c023f/gistfile1.txt"
$wc = New-Object net.WebClient
$wc.DownloadFile($srcUrl,"foo.txt")
$fancySingleQuotes = "[" + [string]::Join("",[char[]](0x2019, 0x2018)) + "]"

$c = Get-Content "foo.txt"
$c | % { `
        $_ = $_.Replace("’","'")
        $_ = $_.Replace("`“","`"")
        $_.Replace("`”","`"")       
    } `
    |  Set-Content "foo2.txt"

Какой трюк для этого?

Ответы [ 4 ]

5 голосов
/ 06 августа 2011

ОБНОВЛЕНИЕ: исправил мой ответ (комментарии manojlds были правильными, $ _ вещь была красной сельдью).Вот версия, которая работает, и я обновил ее, чтобы включить ваш тестовый код:

    $srcUrl="https://raw.github.com/gist/1129778/d4d899088ce7da19c12d822a711ab24e457c023f/gistfile1.txt"
    $wc = New-Object net.WebClient
    $wc.DownloadFile($srcUrl,"C:\Users\hartez\SO6968270\foo.txt")

    $fancySingleQuotes = "[\u2019\u2018]" 
    $fancyDoubleQuotes = "[\u201C\u201D]" 

    $c = Get-Content "foo.txt" -Encoding UTF8

    $c | % { `
        $_ = [regex]::Replace($_, $fancySingleQuotes, "'")   
        [regex]::Replace($_, $fancyDoubleQuotes, '"')     
    } `
    |  Set-Content "foo2.txt"

Причина, по которой версия manojlds не работает для вас, заключается в том, что кодировка файла, из которого вы получаетеgithub не был совместим с символами Unicode в регулярном выражении.Чтение этого как UTF-8 решает проблему.

2 голосов
/ 06 августа 2011

Следующие данные работают на вводе и выводе, который вы дали:

    $c = Get-Content $file 
    $c | % { `

        $_ = $_.Replace("’","'")
        $_ = $_.Replace("`“","`"")
        $_.Replace("`”","`"")
        } `
        |  Set-Content $file
0 голосов
/ 22 марта 2016

Эта статья так близка к тому, что мне нужно.Я искал что-то, что проверило бы для любого UTF8 и нашел эту статью: Notepad ++, Как удалить все символы не ascii с помощью регулярных выражений? Что, кажется, также хорошо работает в PowerShell.

Используемое в PowerShell регулярное выражение:

[^ \ x00- \ x7F] +

, которое найдет любой символ UTF8, вы можете отточить регулярное выражение, если вам нужно быть более конкретным.

Мой ввод имел только фигурные кавычки в виде символов UTF8, поэтому эта простая замена работала:

Заменить кавычку UTF8 стандартной одинарной кавычкой

$ cq =$ cq -relace "[^ \ x00- \ x7F] +", "'"

0 голосов
/ 06 августа 2011

Ваша последняя замена: осталось причудливая цитата с одинарной цитатойЭто то, что вы хотите?это не соответствует вашему примеру вывода.Попробуйте это:

$_.Replace("`“","`"")
$_.Replace("`”","`"")
...