1

所以我有一个看起来像这样的文本文件:

Members : {USER\member1, USER\member2, US
           ER\member3, USER\member4, USER
           \member5, USER\member6}

我想删除USER\. 以下代码将其删除,但在被换行符分割时不会删除,例如US在一行和ER\另一行时。

Foreach-Object { %{$_.Replace('USER\', '') }

插进`n or `r去是不行的。任何帮助表示赞赏。

4

3 回答 3

4

尝试这个:

PS > ((Get-Content .\t.txt) | % { $_.Trim() }) -join "" -replace "USER\\"
Members : {member1, member2, member3, member4, member5, member6}

如果文本在字符串数组中,(Get-Content .\t.txt)请使用您的变量切换。如果您在字符串(不是数组)变量中有文本,请使用:

($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
于 2013-02-12T20:07:09.733 回答
0

这实际上只是对Graimer 解决方案的评论,但它会太长而且作为评论也不够可读,所以我将其作为(补充)答案。

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

$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) 后跟换行符 (```r n``) and a number of spaces that matches the length of the prologue ($pad`) 并将其与序言和尾随花括号粘合在一起。

于 2013-02-12T21:56:37.127 回答
0

可能有更简单的方法可以到达那里,但你可以试试这个:

$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')。对于简单的 - 我只是删除 USER\ 我已使用 herestring 创建要使用的文本,实际文件可能不需要 \r。

于 2013-02-12T21:37:36.560 回答