2010-04-28 14 views
8

Soy un novato en powershell. Tengo un script de PowerShell simple que simplemente reemplaza el texto pero encontré que la expresión regular reemplazar mi fuente de datos de línea múltiple en un solo texto de línea cuando se produce la salida. Quiero que se salven los saltos de línea. Aquí está la versión simplificada del guión.Powershell replace lose line breaks

$source=(Get-Content textfile.txt) 

$process1 = [regex]::Replace($source, "line", "line2") 

$process1 | out-file -encoding ascii textfile2.txt 

Se puede crear un archivo de prueba textfile.txt llamada con líneas simples como esto para probar que

line 
line 
Some line 
More line here 

¿Me he perdido algo obvio?

Gracias, Fadrian

Respuesta

17

Su problema aquí es que Get-Content devuelve un string[] (con un elemento para cada línea en el archivo de origen), mientras que [regex]::Replace espera una cadena. Es por eso que la matriz se convertirá primero en una cadena que simplemente significa unir todos los elementos.

PowerShell proporciona un operador -replace que manejar este caso con más gracia:

(Get-Content .\textfile.txt) -replace 'line', 'line2' | 
    out-file -encoding ascii textfile2.txt 

El operador -replace opera en cada elemento de una matriz individual i que se aplica a una matriz.

Y sí, coincide con la expresión regular y reemplaza. Por ejemplo:

> (Get-Content .\textfile.txt) -replace '(i|o|u)', '$1$1' 
liinee 
liinee 
Soomee liinee 
Mooree liinee heeree 

leer un poco más here y here.

+0

Esto funciona gracias. Todavía se preguntan por qué la expresión regular se comporta de la manera en que es, diferente de la ejecución de la expresión regular en el entorno .NET. –

+2

@Fadrian: agregué un párrafo al comienzo de la respuesta explicando su problema original. Espero eso ayude. – Joey

+0

Gracias Johannes +1 por respuesta y +1 por la publicación –