2010-04-28 21 views
8

Powershell'de bir yeni kullanıcıyım. Sadece metni değiştiren basit bir powershell betiğim var ama çıktı üretildiğinde normal ifadenin yerine çoklu satır veri kaynağını tek satırlı bir metne dönüştürdüm. Hat kesintilerinin korunmasını istiyorum. İşte senaryonun aptal versiyonu.Powershell, satır sonu değerlerini değiştir

$source=(Get-Content textfile.txt) 

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

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

line 
line 
Some line 
More line here 

ben belirgin bir şey kaçırdım mı sınamak için bu gibi basit çizgilerle bir test dosyası çağrı TextFile.txt oluşturabilir

?

sayesinde Fadrian

cevap

17

Sorununuz burada Get-Content döndürdüğünü bir string[][regex]::Replace bir dizi bekler iken (kaynak dosyasındaki her satır için bir öğe ile). Bu yüzden dizi ilk önce tüm öğeleri bir araya toplayan bir dizgeye dönüştürülecektir.

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

-replace operatör dizisi uygulandığından ayrı ayrı i bir dizinin her öğe üzerinde çalışır:

PowerShell daha incelikle bu davayı idare edecek bir -replace operatörü sağlar.

Ve evet, düzenli ifade eşleşir ve yerini alır. Örneğin:

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

Oku here ve here biraz daha.

+0

Bu, teşekkürler. Hala regex'in neden olduğu gibi davrandığını merak ediyorum, .NET ortamındaki normal ifadeden gerçekten farklı. –

+2

@Fadrian: Yanıtın başında orijinal sorununuzu açıklayan bir paragraf ekledim. Umarım yardımcı olur. – Joey

+0

Teşekkürler cevap için + 1 ve cevap için +1 Johannes –