Regex - использование «замены» для удаления контента с использованием групп захвата - PullRequest
2 голосов
/ 18 октября 2019

У меня есть файл CSV, содержащий информацию об адресе, в которой иногда могут быть разрывы строк в поле. Это приводит к тому, что наше программное обеспечение видит это как две отдельные строки с неверными даннымиМоя конечная цель - создать однострочную команду Powershell, которую можно запустить из терминала, чтобы исправить это, однако я не могу на всю жизнь заставить "-replace" работать корректно при вводе групп захвата в уравнение.

Вот файл данных с окончаниями строк, которые могут быть записаны с помощью "\ r \ n":

"name1","address1","city1","state1","zip1"
"name2","address2
2ndline2","city2","state2","zip2"

Вот что у меня есть (не в однострочной строке cmdпока формат):

((get-content "$local\$file" -raw) -replace '(?sm),"[^"]*(?<line>\r\n)[^"]*",', '''${line}<replace>''') `
-replace "<replace>","" | Set-Content "$local\test2.txt"

Я столкнулся с проблемами, выясняя, как заменить группу захвата ничем, поэтому я пытаюсь заменить ее другой строкой, которую затем легко удалить. Когда я запускаю приведенную выше команду, она заменяет все совпадение, а не только группу захвата. Я создал эту строку кода на основе другого предложения здесь: https://stackoverflow.com/a/29973460/6477292

1 Ответ

2 голосов
/ 18 октября 2019

Если у вас PowerShell Core v6.1 и новее, вы можете использовать

(get-content "$local\$file" -raw) -replace ',"[^"\r\n]*\r\n[^"]*",', { $_.Value.Replace("`r`n", "") }

Регулярное выражение ,"[^"\r\n]*\r\n[^"]*", соответствует ,", тогда любые 0+ символов кроме ", CR и LF, затем последовательность CRLF, затем любые 0+ символов, отличные от ", а затем ,.

Блок { $_.Value.Replace(" r n", "") } принимает объект соответствия, изаменяет последовательности CRLF пустой строкой.

В других версиях, которые не поддерживают вызываемый блок при замене команды -replace, это можно сделать только явно с использованием объекта [regex]:

$regex = [regex]',"[^"\r\n]*\r\n[^"]*",'
$callback = {  param($m) $m.Value.Replace("`r`n", "") }
$newfilecontents = $regex.Replace($filecontents, $callback)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...