给出没有前两个或三个字母的字符串 shell

giving string without first two or three letter in power shell

我想从一行中读取一个字符串。该行是

 ERROR: file'C:\Program Files (x86)\movies\action\Theincrediblehulk.mp3' is missing

我只要

 Theincrediblehulk.mp3 

我用来获取该字符串的代码是

Select-String tt.txt -pattern [regex]"[A-Za-z]+\.mp3" -AllMatches | % { $_.Matches } | % { $_.Value }

但它给我的输出是

crediblehulk.mp3

缺少前两三个词。 请提出一个更好的方法来解决这个问题。我使用 [A-Za-z] 因为名称是动态的。

首先抓住引号之间的所有内容

$Filepaths = Select-String tt.txt -pattern "'([^']+)'" -AllMatches | % { $_.Matches } | % { $_.Groups[1].Value }

现在您可以使用Split-Path -Leaf获取文件名:

$Filenames = $Filepaths |Split-Path -Leaf

Path.GetFileName():

$Filenames = $Filepaths |% { [System.IO.Path]::GetFileName($_) }

Mathias R. Jessen 的回答是一个更好的解决方案,但是这个回答解释了为什么原始代码没有按预期工作。


我一开始就根据您的 [regex] 假设,您试图告诉 powershell 将您的字符串转换为正则表达式对象。但是 powershell 实际上将您的论点解释为

-pattern '[regex]"[A-Za-z]+\.mp3"'

如果您确实想将字符串明确视为正则表达式对象,则需要将值括在括号中

-pattern ([regex]"[A-Za-z]+\.mp3")

虽然不需要正则表达式转换,但仅字符串就足够了。

-pattern '[A-Za-z]+\.mp3'