2010-12-14 2 views
4

私はsvn infoを解析してBashの$PS1の適切な文字列を作成するスクリプト(source)を得ました。残念ながら、これはPerl 5.8.8を使っている私が使用している1つのシステムでは動作しません - マッチだけでなくすべての行を出力します。 Perl 5.8.8は次のようになりますか?Perl 5.8.8の置換からの一致のみを返します(:Perl "p" regex修飾子に相当)

__svn_ps1() 
{ 
    local result=$(
     svn info 2>/dev/null | \ 
     perl -pe 's;^URL: .*?/((trunk)|(branches|tags)/([^/]*)).*;\2\4 ;p') 
    if [ -n "$result" ] 
    then 
     printf "${1:- (%s)}" $result 
    fi 
} 

5.10からの出力はスペース、括弧、支店名、タグ名またはtrunkの1、およびエンド括弧が含まれています。 Perl 5.8.8からの出力(最後のpなし)は、svn info出力のスペースで区切られた部分の丸括弧で囲まれた部分を含んでいます。

可能な回避策は、svnperlコマンドの間に単純なgrep '^URL: 'が含まれていますが、これはBashプロンプトごとに実行されるため、避けたいと考えていました。

+0

あなたは何をしようとしているのか説明できますか?入力ファイルと期待する出力を与えます。 – justintime

+0

たぶん私は詰まったレコードのように聞こえるかもしれませんが、 "入力ファイルと出力が期待どおりであることをあなたが何をしようとしているのか説明できますか?"あなたは半分のベーキングソリューションをたくさん提示していますが、私はあなたが望むものを解決することはできません。 – justintime

答えて

11

一致する行からの出力だけが必要な場合は、-pコマンドラインスイッチを使用しないでください。各ループの最後に$_の値を出力します。私はPerlのv5.8およびV5.10のため同じようにそれを行うだろう

perl -ne 'print if s/.../.../' 

:あなたは-nコマンドラインスイッチで何かをしたいかもしれません。 $`、、または$'個の変数またはその一致する同等物を使用していないため、/p修飾語が何をしていると思いますか分かりません。

コマンドラインスイッチはperlrunにあります。

+0

ありがとう、それはちょうど事だった!私は '/ p'とそれが何を誤解していましたか。それでも、Perl 5.10ではすべての行が表示されないというのは変です。 – l0b0

6

perl 5.10から、/pスイッチは、一致したコンテンツを${^PREMATCH},${^MATCH}および${^POSTMATCH}に入れるようにperlに指示します。

投稿したワンライナーは、これらのヴァースを使用することはありませんので、/pは省略してください。

UPDATE:最初の質問に追いつくためにしようと...

perl -ne 's/search/replace/ and print' 

は唯一の交換が行われたためにラインを表示します。 -n-pスイッチの間に注意してください。また、私は5.00で-p/pのコンボを試してみました。そしてそれは変更されていない不一致の行もうまく印刷します。たぶん私は何かを逃した...

+0

質問を明確にしました - 問題はPerlから返されたものの詳細です。 – l0b0

関連する問題