Powershell: регулярное выражение не применяется, серверный тест показывает его правильность

#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. Извините, что регулярное выражение, которое вы доказали позже после того, как я проголосовал, сработало, но символ пробела должен быть там, потому что я хотел также удалить все пробелы.