Назад | Перейти на главную страницу

Powershell 2: как удалить определенный символ из текста ASCII

Я пытаюсь удалить нечетные символы из строк с помощью PowerShell. Я использовал следующий вывод, чтобы попытаться научиться самостоятельно:

get-help about_regular_expressions

Я пытаюсь взять строку, которая в основном состоит из ASCII, но содержит один аномальный символ, который необходимо удалить. (Символ зарегистрированного товарного знака; R с кружком вокруг него.) Я хотел бы убрать любое вхождение этого символа из строки, оставив все остальное нетронутым. Какое наиболее четкое выражение позволяет добиться этого с помощью PowerShell 2.0?

[РЕДАКТИРОВАТЬ]

Я немного покопался и считаю, что проблема связана с используемым мной вызовом Import-CSV.

Когда я вырезаю и вставляю этот символ из блокнота в приглашение PS и назначаю его строке, я отлично подхожу:

# This code yields 'True'
$string -match "\u00ae"

Однако, когда я использую Import-CSV в файле CSV, где одно из полей содержит специальный символ, я считаю, что каким-то образом необработанные байты преобразуются, потому что выполнение чего-то вроде этого не работает:

# This code yields 'False'
$source = Import-CSV -path testing.csv
# The following extracts the entry / line containing the special symbol that was
# copy-and-pasted above
$culprit = $source[5].COMMITTEE_NAME
$culprit -match "\u00ae"

Однако следующее ДЕЙСТВИТЕЛЬНО работает:

# This yields True
$filedata = get-content testing.csv
$filedata[6] -match "\u00ae"

Поэтому я думаю, что мой дополнительный вопрос ко всему этому:

Как я могу сохранить строки без изменений с помощью вызова import-csv, чтобы вызовы -match для отдельных полей по-прежнему работали?

Важно отметить, что консоль PS плохо отображает Unicode. Вам нужно будет использовать ISE, чтобы «увидеть», что происходит. Посмотри на этот связанный вопрос SO для дополнительного чтения. Вы жестяная банка в любом случае используйте символ ® в PS, если вам не нужно смотреть сценарий в действии.

В ISE:

PS C:\Users\jscott> $string = "This string contains the ® character"
PS C:\Users\jscott> $string
This string contains the ® character

PS C:\Users\jscott> $string.Replace("®","")
This string contains the  character

PS C:\Users\jscott> $string ="This ® string ® contains ® many ® characters ®®®®"
PS C:\Users\jscott> $string
This ® string ® contains ® many ® characters ®®®®

PS C:\Users\jscott> $string.Replace("®","")
This  string  contains  many  characters 

Чтобы использовать код символа вместо литерала:

PS C:\Users\jscott> $string.Replace("$([char]0x00AE)","")

По вашему обновлению вопроса:

Вам необходимо преобразовать файл ASCII в Unicode / UTF8, прежде чем запускать его через Import-Csv - Я не знал, что вы это использовали. Все смотрят на этот и этот для других примеров.

Вы можете просто передать исходную мысль файла CSV Get-Content или Export-Csv -Encoding Unicode чтобы предварительно обработать файл и облегчить жизнь.