Получить UNC-пути из TXT-файла с помощью регулярных выражений - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь удалить все данные из текстового файла, который не является путем unc, поэтому, по сути, все до пути UNC.

У меня есть текстовый файл, хранящийся в виде переменной, и я хочу найти / заменить.

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

$lstdata -replace "^"""(\\.""),""



"\app\Program\" "\\Server1\H\RUN\client\client-CD\201901-CD\C116B726\Program\*.*"
"\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\Autorun\*.*"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXCOURFB.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXCOURFI.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXCOURFR.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXHELVFB.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXHELVFR.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXHELVPB.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXHELVPI.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXHELVPR.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\app.CFG"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\app.chm"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\dxr.cnt"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\app.TIP"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\app001.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\app002.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\dxr32.exe"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\app3201.EXE"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXTIMSPB.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXTIMSPI.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DXTIMSPR.TTF"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\DX_View_EULA_v1.0.htm"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\FONTINFO.OFS"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\stamp.exe"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\tr01_d50.icm"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\watermark.enc"
"\app\Program\" "\\domain.com\prodmaster\jobs\company\PROGRAMS\app\2014.02\xerces-c_2_8.dll"
"\app\MNU\" "\\Server1\H\RUN\client\client-CD\201901-CD\C116B726\Mnu\*.*"
"\app\Data\20190101\PNCC116B726SAV\" "\\Server1\H\RUN\client\DATA\201901\C116B726\20190101\PNCC116B726SAV\*.*"
"\app\Data\20190104\MWCC116B726DDA\" "\\Server1\H\RUN\client\DATA\201901\C116B726\20190104\MWCC116B726DDA\*.*"
"\app\Data\20190125\MWCC116B726DDA\" "\\Server1\H\RUN\client\DATA\201901\C116B726\20190125\MWCC116B726DDA\*.*"
"\app\Data\20190131\MWCC116B726DDA\" "\\Server1\H\RUN\client\DATA\201901\C116B726\20190131\MWCC116B726DDA\*.*"

Ответы [ 2 ]

5 голосов
/ 05 марта 2019

Создайте шаблон регулярного выражения, который описывает:

\\[HostName]\[ShareName]\[FilePath]

, а затем замените все вокруг него.Это здесь должно сделать это:

$lstdata -replace '.*(\\{2}[^\\"]+\\[^\\"]+\\[^"]+).*','$1'
#                  \/      \_____/  \_____/  \___/ \/
#              Stuff          |        |       |    Stuff
#                         HostName     |       |
#                                  ShareName   |
#                                           FilePath
1 голос
/ 05 марта 2019

В дополнение к полезный ответ Матиаса Р. Йессена альтернативой на основе оператора -split :

Глядя на ваши входные данные, путь UNC в каждой строке указывается во втором (последнем) двойном кавычке ("..."), поэтому вы можете разделить каждую строку на " символов. и вернуть токен второго-последнего, то есть токен с индексом -2 (синтаксис PSv4 +, из-за использования метода массива .ForEach() ):

# $lstdata is assumed to be an array with the file's lines.
# You can also call .ForEach on (Get-Content ...) directly.
$lstdata.ForEach({ $_ -split '"')[-2] })

Если допустимо включить в результат двойные кавычки, включенные в результат, вы можете просто разделить на пробел , что делает унарная форма -split:

$lstdata.ForEach({ (-split $_)[-1] })

В PSv3- , где метод массива .ForEach() недоступен, вам придется использовать - заметно медленнее - ForEach-Object командлет (чей псевдоним %) в конвейере :

# Without double quotes
$lstdata | ForEach-Object { ($_ -split '"')[-2] }

# With double quotes.
$lstdata | ForEach-Object { (-split $_)[-1] }

Тем не менее, преимущество использования конвейера - это потенциал для регулирования памяти : если вы предоставите вход в тот же конвейер с Get-Content и выведите результаты к файлу в том же конвейере, скажем, с Set-Content, входной файл не нужно загружать в память в целом , поскольку чтение и запись будут происходить по одной строке за раз.

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