我正在尝试从不是unc路径的txt文件中删除所有数据,因此实际上是UNC路径之前的所有内容。
我将txt文件存储为变量,并且想要查找/替换。
我希望此正则表达式字符串与文件的开头匹配,并替换第一组双引号和之间的所有内容,但这不起作用。
$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\*.*"
答案 0 :(得分:5)
构造描述以下内容的正则表达式模式:
\\[HostName]\[ShareName]\[FilePath]
,然后替换它周围的所有内容。这应该在这里完成:
$lstdata -replace '.*(\\{2}[^\\"]+\\[^\\"]+\\[^"]+).*','$1'
# \/ \_____/ \_____/ \___/ \/
# Stuff | | | Stuff
# HostName | |
# ShareName |
# FilePath
答案 1 :(得分:1)
使用基于Mathias R. Jessen's helpful answer运算符的替代项对-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()
数组方法不可用,您必须使用-速度明显慢- { 管道中的{1}} cmdlet (其内置别名为ForEach-Object
):
%
也就是说,使用管道的好处是内存限制 的潜力:如果您要在同一管道中使用# Without double quotes
$lstdata | ForEach-Object { ($_ -split '"')[-2] }
# With double quotes.
$lstdata | ForEach-Object { (-split $_)[-1] }
提供输入并将结果输出到与Get-Content
相同的管道中的文件中,由于会发生读写操作,因此不需要将输入文件作为一个整体加载到内存中。一次一行。