给出没有前两个或三个字母的字符串 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'
我想从一行中读取一个字符串。该行是
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'