2016-04-11 7 views
0

Benim örnek dosyası: n n perl one liner kullanılarak nasıl eşleştirilir?

perl -p0e "s#Chorus:(.*?)\n\n#<i>Chorus:$1</i>#gsm" file 

sonuç:

 
As I Come Into Your Presence 
Key: F 

1 As I come into Your presence 
Past the gates of praise 
Into Your sanctuary 
Till we are standing face to face 
And look upon Your countenance 
I see the fullness of Your glory 
And I can only bow down and say 

<i>Chorus:</i>% 

dayana ı tüm koro blok etrafında <i></i> etiketlerini almak için bu perl tek astar yazdı

 
As I Come Into Your Presence 
Key: F 

1 As I come into Your presence 
Past the gates of praise 
Into Your sanctuary 
Till we are standing face to face 
And look upon Your countenance 
I see the fullness of Your glory 
And I can only bow down and say 

Chorus: 
Your awesome in this place 
Mighty God 
You are awesome in this place 
Abba Father 
You are worthy of all praise 
To You our lives we raise 
You are awesome in this place 
Mighty God 
    <--- Empty line here 
    <--- Empty line here 

Mighty God'dan sonraki tüm korodan sonra </i> etiketinin yazdırılacağı istenen sonucu elde edin.

Hata nerede? Bunu nasıl başarabilirim?

+2

perl -p0e "lar # Koro: \ n \ n # Koro (*.?): $ 1 #gsm \" komut satırında $ – sigmalha

+2

Kullanım tek tırnak .escape dosya perl ifadeleri aksi sarmak için Kabuk genişlemesi başlayacaktır. Alternatif olarak, $ $ gibi @sigmatha önerileri kaçış. – Kenney

+0

Çözüm için @sigmalha teşekkürler. Bu yaptı! –

cevap

2

Çözümünüz çalışacak. Oldukça fazla , kabuk interpolasyonunu her şeyden uzak tutmak için, hangi dil/tercüman çalıştırıyor olursanız olun, kabuktan tek gömlekler için tek tırnak kullanın. Kodunuzda

: En koro siler mutlu

perl -p0e "s#Chorus:(.*?)\n\n#<i>Chorus:</i>#gsm" file 

ve: Her zamankinden Perl bunu görür böylece, Perl bulmadan

perl -p0e "s#Chorus:(.*?)\n\n#<i>Chorus:$1</i>#gsm" file 

$1

kabuk tarafından genişletilmektedir. Bunun yerine tek tırnak işaretleri kullanırsanız, aşağıdaki gibi çalışacaktır:

.

Ancak, -0 öğesinin, girdiye sızan herhangi bir NUL karakterinin yine de Perl'in bu noktada birden fazla kayda bölmesine neden olacağını unutmayın. Bunun yerine -0777 kullanmak daha doğru bir çözüm olacaktır; bu, Perl'e herhangi bir değerin girişi bölmemesi gerektiğini söyler; Hangi verileri içerdiği önemli değil, tek bir kayıt olarak ele alınır.

perl -p0777e 's#Chorus:(.*?)\n\n#<i>Chorus:$1</i>#gsm' file 
2
kaçmak

da $

perl -p0777e "s#Chorus:(.*?)\n\n#<i>Chorus:\$1</i>#gsm" file. 

@Kenney yorumunda söz olarak: Eğer sadece yerine çift tırnak tek tırnak içinde koyarsanız

Use single quotes on the commandline to wrap perl expressions otherwise the shell expansion will kick in. 
+0

Bence, bu gibi bireysel karakterlerden kaçmak kötü bir fikirdir; Bazıları kaçırmak çok kolay. Tek tırnaklar daha güvenilir bir yaklaşımdır. –

+0

yep.it'in hızlı ve kirli bir yolu var. – sigmalha