Powershell:查找并替换由换行符拆分的单词

Powershell:查找并替换由换行符拆分的单词,powershell,Powershell,我有一个文本文件,看起来像这样: Members : {USER\member1, USER\member2, US ER\member3, USER\member4, USER \member5, USER\member6} $s = "Members : {member1, member2, member3, member4, member5, member6}" $s -match '^(.*?{)(.*)(})$' $pad = " " *

我有一个文本文件,看起来像这样:

Members : {USER\member1, USER\member2, US
           ER\member3, USER\member4, USER
           \member5, USER\member6}
$s = "Members : {member1, member2, member3, member4, member5, member6}"

$s -match '^(.*?{)(.*)(})$'
$pad = " " * $matches[1].Length
$matches[1] + ($matches[2] -replace '(.{1,20},) ', "`$1`r`n$pad") + $matches[3]
我想删除USER\。下面的代码将删除它,但当它被换行拆分时不会删除,例如,当我们在一行上,而ER\在另一行上时

Foreach-Object { %{$_.Replace('USER\', '') }
把'n'或'r'放在那里不起作用。感谢您的帮助。

尝试以下方法:

PS > ((Get-Content .\t.txt) | % { $_.Trim() }) -join "" -replace "USER\\"
Members : {member1, member2, member3, member4, member5, member6}
如果文本在字符串数组中,请将Get Content.\t.txt与变量一起切换。如果文本位于stringnot数组变量中,请使用:

($MYSTRINGVAR.Split("`r`n") | % { $_.Trim() }) -join "" -replace "USER\\"
编辑仅修改成员部分:

$text = (Get-Content .\input.txt) -join "`r`n"
($text | Select-String '(?s)(?<=Members : \{)(.+?)(?=\})' -AllMatches).Matches | % {
        $text = $text.Replace($_.Value, ($_.Value -split "`r`n" | % { $_.Trim() }) -join "" -replace "USER\\")
}
$text | Set-Content output.txt
试试这个:

PS > ((Get-Content .\t.txt) | % { $_.Trim() }) -join "" -replace "USER\\"
Members : {member1, member2, member3, member4, member5, member6}
如果文本在字符串数组中,请将Get Content.\t.txt与变量一起切换。如果文本位于stringnot数组变量中,请使用:

($MYSTRINGVAR.Split("`r`n") | % { $_.Trim() }) -join "" -replace "USER\\"
编辑仅修改成员部分:

$text = (Get-Content .\input.txt) -join "`r`n"
($text | Select-String '(?s)(?<=Members : \{)(.+?)(?=\})' -AllMatches).Matches | % {
        $text = $text.Replace($_.Value, ($_.Value -split "`r`n" | % { $_.Trim() }) -join "" -replace "USER\\")
}
$text | Set-Content output.txt

可能有更简单的方法,但您可以尝试一下:

$Text = @'
Members : {USER\member1, USER\member2, US
           ER\member3, USER\member4, USER
           \member5, USER\member6}
'@

# First - USER\ with newline inside..
foreach ($index in 1..4) {
    $Text = $Text -replace ('USER\\'.Insert($index,'(\r\n\s+)')), '$1'
}

# Than - pure USER\
$Text = $Text -replace 'USER\\'
$Text
如您所见,我创建了一些模式,其中包含并保留了结果中的元素“$1”。对于简单的,我只是删除用户\
我已使用herestring创建要使用的文本,实际文件可能不需要这些文本。\r

$Text = @'
Members : {USER\member1, USER\member2, US
           ER\member3, USER\member4, USER
           \member5, USER\member6}
'@

# First - USER\ with newline inside..
foreach ($index in 1..4) {
    $Text = $Text -replace ('USER\\'.Insert($index,'(\r\n\s+)')), '$1'
}

# Than - pure USER\
$Text = $Text -replace 'USER\\'
$Text
如您所见,我创建了一些模式,其中包含并保留了结果中的元素“$1”。对于简单的,我只是删除用户\
我使用了herestring来创建要使用的文本,实际文件可能不需要\r。

这实际上只是对的注释,但它太长,作为注释也不够可读,因此我将其作为补充回答

要在删除用户\后重新包装字符串,可以执行以下操作:

Members : {USER\member1, USER\member2, US
           ER\member3, USER\member4, USER
           \member5, USER\member6}
$s = "Members : {member1, member2, member3, member4, member5, member6}"

$s -match '^(.*?{)(.*)(})$'
$pad = " " * $matches[1].Length
$matches[1] + ($matches[2] -replace '(.{1,20},) ', "`$1`r`n$pad") + $matches[3]
第一个正则表达式将字符串拆分为3个部分,可通过$matches集合访问:

Name  Value
----  -----
3     }
2     member1, member2, member3, member4, member5, member6
1     Members : {
0     Members : {member1, member2, member3, member4, member5, member6}
$matches[1]是开场白,包括开头的花括号,$matches[2]是成员列表,$matches[3]是结尾的花括号。现在,您只需将$matches[2]包装成您想要的任意长度:

'(.*{1,20},) '

以上表示最长匹配,最多20个字符,后跟逗号和空格。将其替换为第一组$1,后面是一个换行符“`rn``和一些与序言$pad`长度匹配的空格,并用序言和尾随的花括号将其粘在一起。

这实际上只是对的注释,但它太长,作为注释也不够可读,所以我把它作为一个补充答案

要在删除用户\后重新包装字符串,可以执行以下操作:

Members : {USER\member1, USER\member2, US
           ER\member3, USER\member4, USER
           \member5, USER\member6}
$s = "Members : {member1, member2, member3, member4, member5, member6}"

$s -match '^(.*?{)(.*)(})$'
$pad = " " * $matches[1].Length
$matches[1] + ($matches[2] -replace '(.{1,20},) ', "`$1`r`n$pad") + $matches[3]
第一个正则表达式将字符串拆分为3个部分,可通过$matches集合访问:

Name  Value
----  -----
3     }
2     member1, member2, member3, member4, member5, member6
1     Members : {
0     Members : {member1, member2, member3, member4, member5, member6}
$matches[1]是开场白,包括开头的花括号,$matches[2]是成员列表,$matches[3]是结尾的花括号。现在,您只需将$matches[2]包装成您想要的任意长度:

'(.*{1,20},) '

以上表示最长匹配,最多20个字符,后跟逗号和空格。将其替换为第一组$1,后跟一个换行符“`rn``和一些与序言$pad`长度匹配的空格,并用序言和尾随的花括号将其粘在一起。

为什么不在运行代码之前抑制所有换行符?%是foreach的别名,为什么要用它两次?你说得对,那是不必要的。我不知道我有这个。为什么不在运行代码之前抑制所有换行符?%是foreach的别名,为什么要用它两次?你说得对,那是不必要的。我不知道我在里面有这个。这个可以用,但它改变了格式。我正在努力做到这一点,并保持格式不变,所以不修剪任何空间。这就是我正在努力解决的问题。这是因为我正在将结果输出到另一个文本文件中。如果USER\是唯一一个大写字母和\的单词,则可以使用Get Content。\t.txt-creplace'[USER\\]“。不幸的是,还有其他大写字母的单词。有没有办法使用修剪和连接的方法仅应用于大括号“{…}”内的文本?这可以工作,但会改变格式。我正在努力做到这一点,并保持格式不变,所以不修剪任何空间。这就是我正在努力解决的问题。这是因为我正在将结果输出到另一个文本文件中。如果USER\是唯一一个大写字母和\的单词,则可以使用Get Content。\t.txt-creplace'[USER\\]“。不幸的是,还有其他大写字母的单词。有没有办法使用修剪和连接的方法只应用于大括号“{…}”中的文本?这是个好主意,但除了成员列表之外,文件中还有其他内容。也许我会考虑一下你的想法,看看我能想出什么。这是个好主意,但除了会员名单之外,档案里还有其他东西。也许我会考虑一下你的想法,看看我能想出什么。