2008-11-28 9 views
26

Dado test.txt que contiene:¿Cómo puedo reemplazar las líneas nuevas con PowerShell?

test 
message 

Quiero terminar con:

testing 
a message 

Creo que el siguiente debería funcionar, pero no es así:

Get-Content test.txt |% {$_-replace "t`r`n", "ting`r`na "} 

¿Cómo puedo buscar y reemplazar donde lo que estoy buscando contiene CRLF?

Respuesta

29

Un CRLF tiene dos caracteres, por supuesto, el CR y el LF. Sin embargo, `n consta de ambos. Por ejemplo:

PS C:\> $x = "Hello 
>> World" 

PS C:\> $x 
Hello 
World 
PS C:\> $x.contains("`n") 
True 
PS C:\> $x.contains("`r") 
False 
PS C:\> $x.replace("o`nW","o There`nThe W") 
Hello There 
The World 
PS C:\> 

Creo que se está ejecutando a tener problemas con el `r. Pude eliminar el `r de su ejemplo, use solo `n, y funcionó. Por supuesto, no sé exactamente cómo generó la secuencia original, así que no sé qué hay allí.

16

En mi comprensión, Get-Content elimina TODAS las nuevas líneas/retornos de carro cuando pasa el archivo de texto a través de la canalización. Para hacer expresiones regulares multilínea, debes volver a combinar tu matriz de cuerdas en una cadena gigante. Hago algo como:

$text = [string]::Join("`n", (Get-Content test.txt)) 
[regex]::Replace($text, "t`n", "ting`na ", "Singleline") 

Aclaración: pequeños archivos únicos gente! Por favor, no intente esto en su   GB de archivos de registro 40 :)

+0

pulgar hacia arriba para que la explicación –

14

Con -Raw debería obtener lo que espera

+1

Vale la pena destacar que esto no está disponible con PS v2, pero si canalizar a Out-String obtendrá el mismo efecto. – Robin

+2

Supongo que el parámetro está ahí como remedio para la rudeza imperdonable del comando al devolver algo que no sea lo que es. +1 por esto. No sabía y exploté 1 hora tratando de descubrir por qué mis cadenas faltaban sus líneas nuevas – ekkis

Cuestiones relacionadas