使用powershell删除两行之间的内容

问题描述 投票:1回答:1

嗨,我有一段代码,其中我需要删除数组中存在的值,但是这需要使用正则表达式来完成,如果有人可以帮助我,那我将无法完成。有帮助。

下面是代码块:

$arr = @("Abd","xyz")

  imports: [
    ddd,
    xxx,
    yyy,
    Abd,
    fff,
    xyz,
    zzz,
    nnn,
  ],

我想完成的是,应删除数组中存在的所有值,这些值应在“ imports:[”和“]的第一个实例”之间

powershell coding-style
1个回答
0
投票

我想类似的事情可能对您有用:

对于演示,我使用的是Here-String,但在现实生活中,您希望使用以下命令从文件中加载它:>

$txt = Get-Content -Path 'X:\input.txt' -Raw  # read as single string

该代码使用正则表达式来获取部件between

'imports: ['']'。然后,它将行分开,并从变量$block中的数组中获取与任何内容都不匹配的行数组。完成此操作后,将在$ matches [1]中找到并保存在变量$toReplace中的原始textblok替换为这些过滤的行(与换行符重新连接)。
$txt = @"
  imports: [
    ddd,
    xxx,
    yyy,
    Abd,
    fff,
    xyz,
    zzz,
    nnn,
  ],
"@

$arr = "Abd","xyz"

# join the values from the array with the regex OR operator `|`
$remove = ($arr | ForEach-Object { [regex]::Escape($_) }) -join '|'

# test if we can find the block of text between 'imports: [' and '],'
$txt = if ($txt -match 'imports: \[([^]]+)') {
    $toReplace = $matches[1]
    $block     = $toReplace -split '\r?\n' | Where-Object { $_ -notmatch $remove }
    $txt.Replace($toReplace, ($block -join [Environment]::NewLine))
}

# output on screen
$txt

# output back to file
$txt | Set-Content -Path 'X:\output.txt'

输出将是

进口:[dddxxx,yyy,fff,zzz,nnn,],

正则表达式详细信息:

imports:\从字面上匹配字符串“ imports:”(不区分大小写)\ [从字面上匹配字符“ [”(匹配下面的正则表达式,并将其匹配捕获到反向引用编号1中[^]]匹配非“]”的任何字符+一次至无限次,尽可能多次,并根据需要进行回馈(贪婪))
© www.soinside.com 2019 - 2024. All rights reserved.