2013-02-12 696 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