Powershell - 匹配可能包含空格的字符串

时间:2016-12-01 20:11:44

标签: string powershell replace contains

使用Powershell版本3&读取文件的内容,然后我需要查看文件中是否包含多个字符串中的一个,如果是,则替换它们。在我的情况下的问题是我需要匹配的字符串之一可能在其中有可变数量的空格(或根本没有)。

我匹配的字符串中有双引号,后跟冒号(:)然后是空格(或无),然后是任意数量的状态(可以是字母或数字),后跟逗号。为简单起见,我只是在下面的代码中使用数字。

$txt = (Get-Content $file)
$oldstr = "`"status`": 1,"
$newstr = '`"status`": 0,"
if (($txt.Contains($old1)) -or ($txt.Contains($oldstr)) -or ($txt.Contains($old2))) {
    $txt.Replace($oldstr, $newstr).Replace($old1, $new1).replace($old2, $new2)| Set-Content -Path $file
}

我遇到的问题是匹配$oldstr,它可能没有,冒号和状态代码之间有一个或多个空格,在这个例子中是一个数字,但它也可能是几个不同的数字或字符串。 $newstr无需复制$oldstr中的空格。此外,在上面的示例中,它使用Contains中的三个条件之一。实际数据可能包含这些字符串中的一个,一个,两个或全部三个。

如何进行匹配/包含和替换可能包含空格的字符串?

2 个答案:

答案 0 :(得分:2)

使用-replace运算符的正则表达式:

PS C:\> '"status":      0' -replace '"status":\s*0','"status": 1'
"status": 1
PS C:\> '"status": 0' -replace '"status":\s*0','"status": 1'
"status": 1
PS C:\> '"status":0' -replace '"status":\s*0','"status": 1'
"status": 1

在我上面使用的模式中:

  • "status":只匹配文字字符串"status":
  • \s*匹配0个或更多空格字符
  • 0与文字0
  • 相匹配

答案 1 :(得分:1)

Here is an interessant solution将几个匹配/替换对与哈希表转换为组合正则表达式。但是我没有把正则表达式加到哈希键中,所以我把表和RegEx都用到foreach中的$ _。

# Build hashtable of search and replace values.

$file = ".\testfile.txt"

$replacements = @{
  'something2' = 'somethingelse2'
  'something3' = 'somethingelse3'
  'morethings' = 'morethingelses'
  'blabla'    = 'blubbblubb'
}
# Join all keys from the hashtable into one regular expression.
[regex]$r = @($replacements.Keys | foreach { [regex]::Escape( $_ ) }) -join '|'

[scriptblock]$matchEval = { param( [Text.RegularExpressions.Match]$matchInfo )
  # Return replacement value for each matched value.
  $matchedValue = $matchInfo.Groups[0].Value
  $replacements[$matchedValue]
}
$fileCont = Get-Content $file
# Perform replace over every line in the file and append to log.
$Newfile = $fileCont | ForEach { 
  $r.Replace( ( $_ -replace '"status":\s*0','"status": 1'), $matchEval ) 
} 

$fileCont
"----"
$Newfile

从testfile.txt

输出此输出
> .\Replace-Array.ps1
"Status":  0, something2,morethings
"Status":    0, something3, blabla
----
"status": 1, somethingelse2,morethingelses
"status": 1, somethingelse3, blubbblubb