2013-02-12 699 views
1

分开单词所以我有一个文本文件,它看起来是这样的:PowerShell的:查找和替换用换行符

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

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

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

`n or `r放在那里不起作用。任何帮助表示赞赏。

+2

为什么不在运行代码之前抑制所有换行符? '%'是foreach的别名,为什么要使用它两次? – 2013-02-12 19:56:31

+0

你是对的,这是没有必要的。我不知道我在那里。 – user2065960 2013-02-12 21:12:56

回答

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 
+0

这可以工作,但它会更改格式。我试图做到这一点,并保持格式,所以没有修剪任何空格。这是我正在努力的部分。 – user2065960 2013-02-12 21:00:31

+0

这是因为我将结果输出到另一个文本文件中。 – user2065960 2013-02-12 21:15:40

+0

如果“USER \”是唯一带有大写(和“\”)字母的单词,那么可以使用'(Get-Content。\ t.txt)-creplace'[USER \\]''。 – 2013-02-12 21:26:14

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。

0

这实际上只是对Graimer's solution的一个评论,但它会太长了,也不足以作为评论可读,所以我将它作为(补充)答案。

$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} 
删除 USER\你可以做这样的事情后

要重新换弦

$matches[1]是开幕花括号的序幕,$matches[2]是会员列表,$matches[3]是结束花括号。现在你只需要在任何你想要的长度来包装$matches[2]

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

上面的意思是“最多20个字符后跟一个逗号和空格的最长匹配”。将其替换为1 st组($1),然后换行符(``r n``) and a number of spaces that matches the length of the prologue ( $ pad`),并用序幕和尾部大括号将其粘合在一起。

+0

这是个好主意,但除了成员列表之外,文件还有其他内容。也许我会玩弄你的想法,看看我能想出什么。 – user2065960 2013-02-13 21:56:49