2013-02-12 4 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, зачем использовать его дважды? –

+0

Вы правы, что не было необходимо. Я не знаю, что у меня это было. – user2065960

ответ

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\\" 

EDIT Просто измените «Участники» часть:

$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

+0

Это потому, что я выводил результат в другой текстовый файл. – user2065960

+0

IF «USER» - это единственное слово с этими буквами в верхнем регистре (и «\»), вы можете использовать '(Get-Content. \ T.txt) -creplace '[USER \\]''. –

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, но он был бы слишком длинным, а также недостаточно читаемым в качестве комментария, поэтому вместо этого я делаю это (дополнительным) ответом.

Чтобы повторно обернуть строку после удаления 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 st ($1), за которой следует разрыв линии (`` `r n``) and a number of spaces that matches the length of the prologue ( $ pad`) и приклеить его обратно вместе с прологом и скользящей фигурной скобкой.

+0

. Это хорошая идея, но есть другие вещи в файле, кроме списка участников. Может быть, я буду играть с твоей идеей и посмотреть, что я могу придумать. – user2065960

Смежные вопросы