2016-04-11 7 views
0

私のサンプルファイル: n nどのように一致させるかperl one linerを使用していますか?

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

結果:

 
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>% 

私ができる」私は全体のコーラスのブロックの周り<i></i>タグを取得するには、このperlのワンライナーを書いた

 
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の後にコーラス全体の後に </i>タグが印刷されるような所望の結果を得ることはできません。

どこがエラーですか?どうすればこれを達成できますか?

+2

perlの-p0e "S#コーラス:\ N \ N#コーラス(*。?)の:$ 1 #gsm \" コマンドライン上の$ – sigmalha

+2

使用単一引用符.escapeファイルはperlの式をそれ以外の場合はラップしますシェルの拡張が始まります。あるいは@sigmathaのように '$'をエスケープしてください。 – Kenney

+0

ソリューションのために@sigmalhaに感謝します。それはそれをした! –

答えて

2

あなただけの単一引用符の代わりに二重引用符でそれを置けばあなたのソリューションが動作します。 常にあなたが実行している言語/インタープリタにかかわらず、シェルからの1ライナーのために単一引用符を使用して、シェル補間を妨害しないようにします。あなたのコードで

:あなたのコーラスを削除喜ん

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

と:それは今までのPerlがこれを見ているので、Perlのに到達する前に

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

$1

は、シェルによって展開されています。代わりにシングルクォートを使用する場合:

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

これは意図したとおりに動作します。

しかし、-0は、入力に入り込むNUL文字を意味しますが、それでもPerlはそれを複数のレコードに分割することになります。より正確な解決策は、代わりに-0777を使用することです。これはPerlに値を入力しないように指示します。どのデータに含まれていても単一のレコードとして扱われます。

perl -p0777e 's#Chorus:(.*?)\n\n#<i>Chorus:$1</i>#gsm' file 
2
は@Kenneyとしても$

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

を逃れる

コメントに言及:

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

私の意見では、そのような個々の文字をエスケープするのは悪い考えです。いくつか見逃しすぎる。シングルクオートはより信頼性の高いアプローチです。 –

+0

yep.itはちょっと速く汚れた方法です。 – sigmalha

関連する問題