2012-01-04 16 views
4

perl正規表現を使用して 'abc'からabcを抽出するにはどうすればよいですか?perlで一重引用符で囲まれた文字列を取り出す方法は?

私は

echo "'abc'" | perl -ne 'if(/\'(.*)\'/) {print $1}' 

を試してみましたが、それは -bash示しています。お返事を事前に予期しないトークンの近くに構文エラー `(」

感謝を

+2

より多くのソリューションがここに投稿されました[perl-one-liner-with-single-quote](0120-18753) – jchips12

+0

@ jchips12 - 私はソリューションが好きです'\ 047' – mob

答えて

2

まあ、安価な方法ではありませんあなたのperlステートメントを一重引用符で囲みます:

echo "'abc'" | perl -ne "if(/'(.*)'/) {print $1}" 

シェルエスケープあなたが本当にそれをあなたが、あなたの最初の単一引用符で囲まれた文字列を最後に引用符を入れて、別のものを開始することができます「正しい」方法を実行したい場合は...

を奇数ルールがあります。

echo "'abc'" | perl -ne 'if(/'\''(.*)'\''/) {print $1}' 
+0

最初の解決策は、シェルの$ 1に何もない場合にのみ機能します。 – choroba

+0

+1あなたは私より4分速いです:) – jchips12

+0

二重引用符は、質問の「$ 1」だけでなく、シェルやPerlの構文が重複しているため、最初の勧告として使用したり、言及したりするべきではありません。 Backwhacking ** any ** '$'は人間にとってエラーを起こしやすく、面倒くさい。 – daxim

7

これはperlの問題ではなく、これはシェルの問題です。シングルクォートをシングルクォートに含めることはできません。あなたが'\''で各単一引用符を交換する必要が

あなたとあなたの単一qouteをエスケープする必要が

echo "'abc'" | perl -ne 'if(/'\''(.*)'\''/) {print $1}' 
1

「\」」

(単一引用符の終わりには、単一引用符、ACシングル引用符の開始をエスケープ)

echo "'abc'" | perl -ne 'if(/'\''(.*)'\''/){print $1}'

1

あなたにはシェルの問題がありますが、Perlの問題ではありません。

これはsedのために良い使用です:

echo "'abc'" | sed "s/'//g" 
2

choroba's answerは、正確な問題を解決します。任意の引用問題への一般的な解決のために、String::ShellQuoteを使用します。

   $ alias shellquote='perl -E'\'' 
        use String::ShellQuote qw(shell_quote); 
        local $/ = undef; 
        say shell_quote <>; 
       '\''' 
       $ shellquote 
user input → if(/'(.*)'/) {print $1}␄ 
perl output → 'if(/'\''(.*)'\''/) {print $1}' 
2

ターン・オフのシェル拡張をalternate quoting methodを使用することが直接のbashにドル記号を使用して、単一引用符で囲まれたPerlコードの前には:

echo "'abc'" | perl -ne $'if(/\'(.*)\'/) {print $1}' 
関連する問題