使用 PowerShell 提取子字符串

如何使用 PowerShell 提取子字符串?

我有一根绳子。

"-----start-------Hello World------end-------"

我必须提取..。

Hello World

最好的方法是什么?

343598 次浏览

Substring方法为我们提供了一种基于起始位置和长度从原始字符串中提取特定字符串的方法。如果只提供一个参数,则将其视为起始位置,并输出字符串的其余部分。

PS > "test_string".Substring(0,4)
Test
PS > "test_string".Substring(4)
_stringPS >

但这样更容易。

 $s = 'Hello World is in here Hello World!'
$p = 'Hello World'
$s -match $p

最后,遍历一个目录,只选择. txt 文件并搜索出现的“ Hello World”:

dir -rec -filter *.txt | Select-String 'Hello World'

-match操作符测试一个正则表达式,将它与魔术变量 $matches组合以得到结果

PS C:\> $x = "----start----Hello World----end----"
PS C:\> $x -match "----start----(?<content>.*)----end----"
True
PS C:\> $matches['content']
Hello World

如果对正则表达式有疑问,请访问这个站点: http://www.regular-expressions.info

在 Matt 的答案的基础上,这里有一个跨新行搜索的方法,可以很容易地为您自己的使用进行修改

$String="----start----`nHello World`n----end----"
$SearchStart="----start----`n" #Will not be included in results
$SearchEnd="`n----end----" #Will not be included in results
$String -match "(?s)$SearchStart(?<content>.*)$SearchEnd"
$result=$matches['content']
$result

--

注意: 如果您想对一个文件运行这个命令,请记住 Get-Content 返回一个数组,而不是一个字符串。你可以通过以下方法来解决这个问题:

$String=[string]::join("`n", (Get-Content $Filename))

因为字符串并不复杂,所以不需要添加正则表达式字符串

$line = "----start----Hello World----end----"
$line -match "Hello World"
$matches[0]
Hello World


$result = $matches[0]
$result
Hello World

其他解决办法

$template="-----start-------{Value:This is a test 123}------end-------"
$text="-----start-------Hello World------end-------"


$text | ConvertFrom-String -TemplateContent $template
PS> $a = "-----start-------Hello World------end-------"
PS> $a.substring(17, 11)
or
PS> $a.Substring($a.IndexOf('H'), 11)

$a.Substring(argument1, argument2) —— > 这里 argument1 = 所需字母表的起始位置,argument2 = 作为输出的子字符串的长度。

这里17是字母表 'H'的索引,因为我们想打印到 Hello World,所以我们提供11作为第二个参数

不确定这是否有效,但是可以使用数组索引语法引用 PowerShell 中的字符串,其方式与 Python 类似。

它不是 彻底的直观的,因为事实上第一个字母是由 index = 0引用的,但它确实是:

  • 允许第二个索引号长于字符串,而不会产生错误
  • 反向提取子字符串
  • 从字符串的末尾提取子字符串

下面是一些例子:

PS > 'Hello World'[0..2]

产生结果(为清晰起见包含了索引值,但在输出中没有生成) :

H [0]
e [1]
l [2]

通过传递 -join ''可以使其更加有用:

PS > 'Hello World'[0..2] -join ''
Hel

通过使用不同的索引,你可以获得一些有趣的效果:

前进

使用小于第二个索引值的第一个索引值,子字符串将按照您预期的方向提取。这一次,第二个索引值远远超过字符串长度,但是没有错误:

PS > 'Hello World'[3..300] -join ''
lo World

不像:

PS > 'Hello World'.Substring(3,300)
Exception calling "Substring" with "2" argument(s): "Index and length must refer to a location within
the string.

倒过来

如果提供的第二个索引值小于第一个索引值,则反向返回该字符串:

PS > 'Hello World'[4..0] -join ''
olleH

终点站

如果你使用负数,你可以引用一个位置 从绳子的末端开始。为了提取最后5个字母 'World',我们使用:

PS > 'Hello World'[-5..-1] -join ''
World

我需要提取一个日志文件中的几行,这篇文章有助于解决我的问题,所以我想添加到这里。如果有人需要提取多行,您可以使用该脚本获取与该字符串匹配的单词的索引(我正在搜索“ Root”) ,并提取所有行中的内容。

$File_content = Get-Content "Path of the text file"
$result = @()


foreach ($val in $File_content){
$Index_No = $val.IndexOf("Root")
$result += $val.substring($Index_No)
}


$result | Select-Object -Unique

干杯!