使用Powershell从字符串变量进行精确匹配

xdnvmnnf  于 2023-04-21  发布在  Shell
关注(0)|答案(1)|浏览(231)

我已经尝试了应用程序的选择字符串或匹配等,以获得我所需要的。它只是没有发生。使用字符串为例..我正在搜索一个文本文件,所以我可以抓住每一个匹配行的ed,这样我就可以保存字符串后的数据。

& data df put king/man/ConnString
& data df put king/man/ConnStringLog
& data df put king/man/ConnStringSession

例如,如果我使用-SimpleMatch查找字符串“& data df put king/man/ConnString”,我会得到如下所示的所有三行:

& data df put king/man/ConnString "Connection data 1"
& data df put king/man/ConnStringLog "Connection Log data"
& data df put king/man/ConnStringSession "Conn String data"

我想要一个完全匹配,这样我就可以抓住保存后的数据“&数据df把国王/人/连接字符串”,我留下了“连接数据1”,以及为每一个其他行我搜索一样

& data df put king/man/ConnStringLog
& data df put king/man/ConnStringSession

任何帮助将不胜感激。

shstlldc

shstlldc1#

您可以搜索这些不同的字符串,如下所示:

# read the text as single multiline string
$text = Get-Content -Path 'X:\Somewhere\yourfile.txt' -Raw
# create a regex string with placeholder {0}
$regex = '(?m)^& data df put king/man/{0}\s+(".+")'
# clear some variables
$connString = $connStringLog = $ConnStringSession = $null
$connString = if ($text -match ($regex -f 'ConnString')) {
    $matches[1]  # --> "Connection data 1"
}

$connStringLog = if ($text -match ($regex -f 'ConnStringLog')) {
    $matches[1]  # --> "Connection Log data"
}

$ConnStringSession = if ($text -match ($regex -f 'ConnStringSession')) {
    $matches[1]  # --> "Conn String data"
}

或者使用regex -replace

# read the text as single multiline string
$text = Get-Content -Path 'X:\Somewhere\yourfile.txt' -Raw
# create a regex string with placeholder {0}
$regex = '(?sm).*^& data df put king/man/{0}\s+("[^"]+").*'
$connString = $text -replace ($regex -f 'ConnString'), '$1'
$connStringLog = $text -replace ($regex -f 'ConnStringLog'), '$1'
$ConnStringSession = $text -replace ($regex -f 'ConnStringSession'), '$1'

$connString         # --> "Connection data 1"
$connStringLog      # --> "Connection Log data"
$ConnStringSession  # --> "Conn String data"

P.S.如果您还需要搜索区分大小写,则在第一个代码中将-match更改为-cmatch,在第二个代码中将-replace更改为-creplace
根据您的注解,所需数据可能会或可能不会像示例行中那样被引用,然后将第一个代码块中的正则表达式创建更改为

$regex = '(?m)^& data df put king/man/{0}\s+(.+)'

基本上去掉正则表达式中的引号
作为替代,这里有另一种使用switch(逐行)的方法:

# clear some variables
$connString = $connStringLog = $ConnStringSession = $null
switch -Regex -File 'X:\Somewhere\yourfile.txt' {
    '^& data df put king/man/ConnString\s+(.+)$'        { $connString = $matches[1] }
    '^& data df put king/man/ConnStringLog\s+(.+)$'     { $connStringLog = $matches[1] }
    '^& data df put king/man/ConnStringSession\s+(.+)$' { $ConnStringSession = $matches[1] }
}

$connString         # --> Connection data 1
$connStringLog      # --> Connection Log data
$ConnStringSession  # --> Conn String data

相关问题