Как добавить символы до и после других символов в текстовой строке в Powershell - PullRequest
0 голосов
/ 01 мая 2020

Мой код захватывает строку чисел из другого файла с использованием регулярного выражения (. *). Всегда должно быть не менее четырех чисел

. Выходные данные могут быть

1456 или 234567

Но скажем, это

3667876

Я хочу добавить «км» перед тремя последними цифрами и «м» после последних трех цифр. Таким образом, в результате получается

3667km 876m

Строка кода в скрипте Powershell:

Get-Content -Tail 0 -Wait -Encoding "UTF8" $log | 
  Select-String "Run Distance: (.*)" |
   % {"Total Distance `- " + $_.matches.groups[1].value} |
    Write-SlowOutput -outputFile $output -waitFor $delay

Так что в этом случае вывод будет выглядеть как

Всего Расстояние - 3667 км 876 м

Может ли кто-нибудь помочь с формулой регулярного выражения для использования вместо (. *) В этом скрипте Powershell.

Спасибо

Ответы [ 3 ]

3 голосов
/ 01 мая 2020

вот еще один способ сделать работу. [ grin ] Вы можете использовать шаблон регулярных выражений с оператором -replace, чтобы заменить цифры в строке и построить новую строку с группами совпадений. вот так ...

'1234' -replace '(.+)(.{3})$', '$1km $2m'

output = 1km 234m

ошибка в том, что номер должен иметь как минимум 4 цифры для правильной работы . если у вас может быть меньше цифр для работы, то необходимо решение, аналогичное Thomas или FoxDeploy.

2 голосов
/ 01 мая 2020

У меня нет командлета Write-SlowOutput, но вывод командлета ForEach-Object выглядит нормально:

Get-Content -Tail 0 -Wait -Encoding "UTF8" $log | 
    Select-String "Run Distance: (\d+)(\d{3})$" |
    % {"Total Distance `- $($_.matches.groups[1].value)km $($_.matches.groups[2].value)m"} |
    Write-SlowOutput -outputFile $output -waitFor $delay

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

1 голос
/ 01 мая 2020

Если вам нравится какой-то более читаемый код, вы также можете легко это сделать, преобразовав свой int в строку, используя ToString(), а затем используйте Substring(), чтобы разделить его на части. Результат очень легко читается.

ForEach($n in $nums){
    $splitIndex = $n.ToString().Length - 3    
    $KMs =  $n.ToString().Substring(0,$splitIndex)
    $Meters = $n.ToString().SubString($splitIndex, 3)
    "Total distance $KMs Kilos - $Meters meters"
}

В результате

Total distance 3667 Kilos - 876 meters
Total distance 33667 Kilos - 876 meters
Total distance 45454 Kilos - 131 meters
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...