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

#regex #powershell #replace

#регулярное выражение #powershell #заменить

Вопрос:

ipconfig | Select-String "IPv4 Address" возвращает что-то вроде этого:

    IPv4 Address. . . . . . . . . . . : 192.168.1.50
   IPv4 Address. . . . . . . . . . . : 172.20.112.1
   IPv4 Address. . . . . . . . . . . : 192.168.208.1
 

Допустим, я хотел заменить «IPv4-адрес. . . . . . . . . . . :» с пустой строкой, используя -replace . Как бы я это сделал? Вот что я попробовал:

 ipconfig | Select-String "IPv4 Address" -replace "IPv4 Address. . .",""
 

Это дало мне следующую ошибку:

 Select-String : A parameter cannot be found that matches parameter name 'replace'.
At line:1 char:41
  ipconfig | Select-String "IPv4 Address" -replace "IPv4 Address. . .", ...
                                          ~~~~~~~~
      CategoryInfo          : InvalidArgument: (:) [Select-String], ParameterBindingException
      FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.SelectStringCommand
 

Есть какие-нибудь идеи?

Ответ №1:

Используя only Select-String , вы можете использовать группу захвата для извлечения IP-адреса:

 ipconfig | Select-String "IPv4 Address.*:s*(. )" | ForEach-Object { $_.Matches.Groups[1].Value }
 
  • .*: соответствует всему, вплоть до :
  • s* соответствует любому (нулевому или более) пробелу между : и IP-адресом
  • (. ) сопоставляет IP-адрес (еще один символ) и записывает его в группу 1
  • $_.Matches.Groups[1].Value выводит значение группы захвата 1, которое является IP-адресом

Эта ссылка дает хороший обзор многих возможностей использования регулярных выражений с PowerShell.

Ответ №2:

Вы можете использовать

 ipconfig | Select-String "IPv4 Address" | foreach { $_ -replace '.*:s*' }
 

С .*:s* помощью вы сопоставляете весь текст до последнего : в строке, а s* также используете любые нулевые или более пробельные символы после двоеточия.

Вот демонстрация регулярных выражений.

Комментарии:

1. Поскольку вы работаете в PowerShell, зачем использовать ipconfig.exe , против Get-NetIPAddress | Select -Property IPv4Address или (Get-NetIPAddress).IPv4Address , тогда скажи это (Get-NetIPAddress).IPv4Address | ForEach {$PSItem -replace $PSitem, ''}

Ответ №3:

Установите Git. Запустите Git Bash и используйте grep и sed (или cut или awk ):

 $ ipconfig | grep 'IPv4 Address' | sed 's/.*: //'
 

s/xyz/abc/ означает , что вы создаете с. xyz abc

Комментарии:

1. Да, все фанаты Windows сошли с ума. 😉 Хорошо, я фанат Linux. Но я бы на самом деле сделал это именно так. И это работает, я это проверил. По крайней мере , на немецком компьютере с. 'IPv4-Adresse'