#regex #powershell
#регулярное выражение #powershell
Вопрос:
у меня довольно грязный файл, это вывод PM2, когда вы передаете его в .txt-файл. Выглядит так:
ÔöîÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÉ
Ôöé id Ôöé name Ôöé version Ôöé mode Ôöé pid Ôöé uptime Ôöé Ôå║ Ôöé status Ôöé cpu Ôöé mem Ôöé user Ôöé watching Ôöé
Ôö£ÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöñ
 0  Backendserver  0.0.1  fork  60168  2D  0  online  0%  563.4mb  Adminis  disabled 
 1  Frontendserver  N/A  fork  25976  2D  0  online  0%  71.3mb  Adminis  disabled 
 2  Schedulingservice  N/A  fork  38904  2D  0  online  0%  58.9mb  Adminis  disabled 
 3  edi-csv-server  0.0.1  fork  46728  2D  0  online  0%  54.7mb  Adminis  disabled 
 5  edi-frontendserver  N/A  fork  49584  2D  0  online  0%  56.5mb  Adminis  disabled 
 4  edi-sybase-inferface  0.0.1  fork  31156  2D  0  online  0%  60.2mb  Adminis  disabled 
ÔööÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÿ
host metrics | cpu: 2.8% | mem: 46.2% | net: 64.8ms Ôçô 0.001mb/s Ôçæ 0.003mb/s | disk: Ôçô 0mb/s Ôçæ 0mb/s |
Итак, у меня есть небольшие сценарии powershell для удаления сумасшедших символов, потому что я хочу использовать его позже в приложении c #, но форматирование и читаемость должны выполняться с помощью powershell.
$c = Get-Content -Path "C:UserstautDocumentsgitPM2PM2scriptstest.txt" -Encoding UTF8
$c -replace '/[ÔöîǼéåçôöɪæ┤╝| ]/', ''
New-Item -Path "C:UserstautDocumentsgitPM2PM2scriptsnew.txt" | Set-Content -Value $c -Encoding UTF8
Но моя проблема в том, что новый файл содержит точно то же самое, что и исходный файл.
Я пытался regex101.com и regexr.com оба сказали, что мое регулярное выражение правильное.
Большое вам спасибо, ребята, я понятия не имею, откуда берется проблема.
Комментарии:
1. @Theo уже пробовал это, выполнял работу, тот же результат … также пытался присвоить результат другой переменной, но все еще не работает.
2. Файл выглядит так, как будто он использует расширенные символы ASCII или какие-то терминальные элементы управления для рисования таблицы. При использовании неправильной кодировки символы преобразуются в алфавиты.
3. мое регулярное выражение правильное ? Я думаю, что нет. Косых черт до и после квадратных скобок не должно быть, вы пытаетесь также удалить пробелы и пропустить пару символов.
Ответ №1:
Вот один из способов извлечения данных из этого ужасного текста с помощью ConvertFrom-String
Сначала мы предоставляем некоторые «обучающие» данные в шаблоне.
$template = @'
ÔöîÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÉ
Ôöé id Ôöé name Ôöé version Ôöé mode Ôöé pid Ôöé uptime Ôöé Ôå║ Ôöé status Ôöé cpu Ôöé mem Ôöé user Ôöé watching Ôöé
Ôö£ÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöñ
 0  {Host*:Backendserver}  {Version:0.0.1}  {Mode:fork}  {PID:60168}  {Uptime:2D}  0  {Status:online}  {CPU:0%}  {Mem:563.4mb}  {User:Adminis}  {Watching:disabled} 
 1  {Host*:Frontendserver}  {Version:N/A}  {Mode:fork}  {PID:25976}  {Uptime:2D}  0  {Status:online}  {CPU:0%}  {Mem:71.3mb}  {User:Adminis}  {Watching:disabled} 
ÔööÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÿ
'@
Теперь мы используем этот шаблон для извлечения данных
@'
ÔöîÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö¼ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÉ
Ôöé id Ôöé name Ôöé version Ôöé mode Ôöé pid Ôöé uptime Ôöé Ôå║ Ôöé status Ôöé cpu Ôöé mem Ôöé user Ôöé watching Ôöé
Ôö£ÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö╝ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöñ
 0  Backendserver  0.0.1  fork  60168  2D  0  online  0%  563.4mb  Adminis  disabled 
 1  Frontendserver  N/A  fork  25976  2D  0  online  0%  71.3mb  Adminis  disabled 
 2  Schedulingservice  N/A  fork  38904  2D  0  online  0%  58.9mb  Adminis  disabled 
 3  edi-csv-server  0.0.1  fork  46728  2D  0  online  0%  54.7mb  Adminis  disabled 
 5  edi-frontendserver  N/A  fork  49584  2D  0  online  0%  56.5mb  Adminis  disabled 
 4  edi-sybase-inferface  0.0.1  fork  31156  2D  0  online  0%  60.2mb  Adminis  disabled 
ÔööÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔö┤ÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÿ
'@ | ConvertFrom-String -TemplateContent $template -OutVariable results
И вывод (обрезанный)
Host : Backendserver
Version : 0.0.1
Mode : fork
PID : 60168
Uptime : 2D
Status : online
CPU : 0%
Mem : 563.4mb
User : Adminis
Watching : disabled
Host : Frontendserver
Version : N/A
Mode : fork
PID : 25976
Uptime : 2D
Status : online
CPU : 0%
Mem : 71.3mb
User : Adminis
Watching : disabled
Host : Schedulingservice
Version : N/A
Mode : fork
PID : 38904
Uptime : 2D
Status : online
CPU : 0%
Mem : 58.9mb
User : Adminis
Watching : disabled
И оно также записывается в $results
переменной, которую мы можем использовать для дальнейшей обработки.
$results | Format-Table
Host Version Mode PID Uptime Status CPU Mem User Watching
---- ------- ---- --- ------ ------ --- --- ---- --------
Backendserver 0.0.1 fork 60168 2D online 0% 563.4mb Adminis disabled
Frontendserver N/A fork 25976 2D online 0% 71.3mb Adminis disabled
Schedulingservice N/A fork 38904 2D online 0% 58.9mb Adminis disabled
edi-csv-server 0.0.1 fork 46728 2D online 0% 54.7mb Adminis disabled
edi-frontendserver N/A fork 49584 2D online 0% 56.5mb Adminis disabled
edi-sybase-inferface 0.0.1 fork 31156 2D online 0% 60.2mb Adminis disabled
$results | where Version -ne 'n/a' | select host,version,cpu,mem
Host Version CPU Mem
---- ------- --- ---
Backendserver 0.0.1 0% 563.4mb
edi-csv-server 0.0.1 0% 54.7mb
edi-sybase-inferface 0.0.1 0% 60.2mb
Вот как вы могли бы использовать его для чтения из файла
$csvfile = 'C:UserstautDocumentsgitPM2PM2scriptstest.txt'
Get-Content $csvfile -Raw -Encoding UTF8 |
ConvertFrom-String -TemplateContent $template -OutVariable results
Ответ №2:
Попробуйте это регулярное выражение [^s w /|:.%]
в команде:
$c -replace '/[^s w /|:.%]/', ' '
Ответ №3:
Как указано, способ, которым ваш код должен работать, заключается в том, чтобы записать результат -replace
действия обратно в c$
переменную с помощью $c = $c -replace '[ÔöîǼéåçôöɪæ┤╝|£ñÿ]'
.
Затем используйте это для записи нового файла.
Как вы можете видеть, ваша строка регулярного выражения неверна; она должна быть [ÔöîǼéåçôöɪæ┤╝|£ñÿ]
Кроме того, вам не нужно New-Item
там, и вы можете передать замененный текст прямо в Set-Content
вот так:
$c = Get-Content -Path "D:Testblah.txt" -Encoding UTF8
$c -replace '[ÔöîǼéåçôöɪæ┤╝|£ñÿ]' | Set-Content -Path "D:Testnew.txt" -Encoding UTF8
Комментарии:
1. Как указано в моем комментарии, это тоже не работает.
2. @FlorianTaut Не отклоняйте это. Ваше регулярное выражение было совершенно неправильным, и вы должны сначала попробовать код. Кроме того, ваш вопрос не показывает, что вы уже пробовали! На самом деле, вы даже хвастаетесь, что ваше регулярное выражение правильное, хотя это явно не так.
3. Извините, что регулярное выражение, которое вы доказали позже после того, как я проголосовал, сработало, но символ пробела должен быть там, потому что я хотел также удалить все пробелы.