Dosya adının bir bölümünü taşımak için sed kullanma


0

'Parça adı [sanatçı]' olarak adlandırılan bazı müzik dosyalarım var.

Onların '[artist] trackname' 'olmalarını istiyorum ve bu yüzden köşeli parantezleri ve içindekileri dosyanın başlangıcına getirmeliyim.

Sadece sed'i keşfettim, ama istediğimi yapmak için nasıl kullanılacağını anlamak için beyinlere sahip değilim.

Yanıtlar:


0

Sed kullanarak

Bunu yapmanın birçok yolu vardır. Bunu öğrenirken yapmak istiyorsanız sed, deneyin:

$ filename='track name [artist].mp3'
$ newname=$(echo "$filename" | sed -E 's/(.*[^[:space:]])[[:space:]]*[[](.*)[]]/[\2] \1/')
$ echo "$newname"
[artist] track name.mp3

Sed ikame komut şekline sahip bir ifadedir. Bu durumda parçalardan oluşur:s/old/new/oldold

  1. (.*[^[:space:]])parça adını yakalar. Bu regex parens ile çevrili olduğundan, parça adı bir gruba kaydedilir. .*Bölüm şeyle eşleşir. [^[:space:]]Maçları herhangi boşluk olmayan. [^[:space:]]Sona koyarak , bunun iz adını yakaladığını ancak ondan sonraki beyaz alanı değil.

  2. [[:space:]]*[[]Varsa, parça adını [izleyen ve bunları izleyen boşluklarla eşleşir . Çünkü [baştan çıkarıcı bir karakter, ondan bir şekilde kaçmamız gerekiyor. Burada, onu köşeli parantez içine alarak kaçarız [[].

  3. (.*)[]]Metin ], dosya adındaki son ile eşleşir . Buradaki parenler, sanatçının adının ikinci bir grup olarak yakalanmasına neden oluyor.

newİkame komutunun bir parçasıdır [\2] \1. Bu, ikinci grubu \2(sanatçı adı) birinci ve birinci grubu \1(parça adı) ikinci koyar .

Dosyaları yeniden adlandırmak için kısayol

Amacınız dosyaları yeniden adlandırmaksa rename, perl paketindeki komutu tavsiye ederim (bazen denir prename):

$ ls *mp3
track name [artist].mp3
$ prename 's/(.*[^[:space:]])[[:space:]]*[[](.*)[]]/[$2] $1/' *.mp3
$ ls *mp3
[artist] track name.mp3

prenamesed en ancak referanslar yakalanan gruplar olarak değil çok benzer bir perl ikame komutu kullanır \1ve \2ancak $1ve $2.

NOT: Bazı linux'lar uyumsuz olan ve yukarıdaki gibi çalışmayan farklı bir renameyardımcı program yükler .


@ John1024 ... teşekkürler. Sebep ne olursa olsun, sadece bugün kabul etmeye / oylamaya çalıştığım cevabınızı bildirdim. Bu bir cevap olarak eklenmiştir, çünkü bir yorum kabul etmeyecektir.
gulliver

soru kayıtsız bir hesap olarak gönderildi gibi görünüyor. Birleşme talebinde bulunmak için bize ulaşın bağlantısını kullanın.
Journeyman Geek

@gulliver Bu ay çok geç farkına varsanız bile, yardım ettiğine sevindim. Umarım, JourneymanGeek'in önerisini takiben hesabınızı düzeltebilirsiniz. 15 puan kazanana kadar oy kullanamazsınız, ancak kendi sorularınız için kesinlikle bir cevap kabul edebileceksiniz. Hesabınız ortadan kalktığında bana haber verin, ben de sorunuzu geri alayım.
John1024
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.