2013-06-04 10 views
5

PowerShell'de bir adlandırma komut dosyası oluşturmakta oldukça sorun yaşıyorum. durum: "dört basamak - metin - önemsiz" Ben için adlandırmak istiyorum "metni (dört haneli)" Şu anda ben yarattıkPowerShell regex gruplandırması

: Ben aşağıdaki biçimde adında klasörler bir dizinde bazı örnek adlarını içeren bir dizin uğraşmak: - ilginç bir şey - berbat bir şey

2006 -

1996 bu kopya - yankı için bir komut dosyası kurma denedim

görmezden onların ile başlayan isimler, ancak normal ifadenin asıldığını alamıyorum. Aşağıdaki kod sadece baskılar "1996 - şey" ve "2006 - copy"

Get-ChildItem | Foreach-Object { if ($_.BaseName -match "(\d{4} - \w+ -*)") { echo $matches[0]}} 

ve yazdırır bu bir "1996 - ilginç bir şey - şey berbat \ n()" ve "2006 - Bu kopya - görmezden \ 'eşleştirme için bir sınır olarak - n()"

Get-ChildItem | Foreach-Object { echo ($_.BaseName -replace "(\d{4} - \w+ - *)"), "$2 ($1)"} 

birisi ne yaklaşım literal dize saygı neden bana söyleyebilir?' bundan önce sonunda boşluk kırpmak etmektir -

Get-ChildItem | Foreach-Object { 
    if ($_.BaseName -match "(\d{4} - [^-]*)") { 
     echo $matches[0].TrimEnd() 
    } 
} 

Not TrimEnd:

* DÜZENLEME * Teşekkür zespri, sorunumu çözdü kod

Get-ChildItem | Foreach-Object { 
if ($_.BaseName -match "(\d{4} - [^-]*)") { 
    Rename-Item $_ ($_.BaseName -replace "(\d{4}) - (.+)(?= -).*" ,'$2 ($1)') 
    } 
} 

cevap

5

Will sizin için bu iştir ikinci çizgi.

Örneklerinizin neden çalışmadığıyla ilgili olarak: \ w + herhangi bir kelime karakteriyle eşleşir, böylece "ilginç bir şey" içindeki boşlukla eşleşmez. * sıfır veya daha fazla demektir. Yani - * durumunuzda sıfır veya daha fazla tire ile eşleşir - sıfır.

sizin için işe yarayabilecek bir ifade yazmak için başka bir yoludur: (?= -) yapısı o kayıtlara alınmaktadır Bu durumda positive lookahead assertion Sonunda ekstra alan kırpmak gerekmez olduğunu

Get-ChildItem | Foreach-Object { 
    if ($_.BaseName -match "(\d{4} - .+(?= -))") { 
     echo $matches[0] 
    } 
} 

düzenli ifadenin kendisi için.

Güncelleme 1

dönüşümü yapmak Modifiye:

gci | %{ $_.BaseName -replace "(\d{4}) - (.+)(?= -).*" ,'$2 ($1)' } 
+0

evet maç olanların isimlerini yankılanacak, bunda bir adım Doğru yön. Şimdi onunla bir şeyler yapmak için: "ilginç bir şey (rakamlar)" için yeniden biçimlendirin. Ayırmak istediğim iki parçayı parantez içinde sarmayı ve $ eşleşmeleriyle çıkarmayı denedim [0] .Gruplar [] la http://stackoverflow.com/questions/614651/how-do-you-extract-the -value-of-a-regex-backreference-in-powershell ile eşleşen, ancak geçerli bir operatör değil.Ayrıca adlandırılmış ve adlandırılmamış grupları kendi aralarında yapmaya çalıştım, ancak tüm metinden veya boş bir çift parantezden başka bir şey alamıyorum. – Glader

+0

@Glader: Doğru yönde yumuşak bir dürtünün yeterli olacağını umuyordum. İsimleri yeniden biçimlendiren kodu eklemek için cevabı değiştirdim. –

+0

Öyleyse, ama ben hayatımın doğru yöntemini anlayamadım ... ilk regex'e birden fazla ya da çok sayıda istekte bulunarak çalıştı ama her zaman kıçımda bir şeyler ısırdı. ^^ Çok teşekkür ederim, orijinal gönderiyi gittiğim kodla güncelledim. – Glader

0

bu deneyin:

Get-ChildItem | 
    Select-String -Pattern '(\d{4})\s+-\s+(\w+(\s+\w+)*)\s+-.*' | 
    Foreach-Object { "$($_.Matches.Groups[2].Value) ($($_.Matches.Groups[1].Value))"