2012-03-16 32 views
1

コンマで区切られた電子メールアドレスのリストを含む設定ファイルに対して、PERLライナーを使用しようとしています。Perlの1つの正規表現の投げ方bash:予期しないトークンの近くの構文エラー `) '

perl -nle 'print for m/\* Members= (\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)*$/i)/g' 

リターンはbash:

syntax error near unexpected token `)' 

正規表現は、シェルとよく遊んでいないようです。私は何かが適切にエスケープされていないと思うが、エラーの性質上、正規表現そのものはどこを見てもわからない。何か案は?

+5

ここで強調表示されている色のついた構文があなたの質問によく答えると思います:) –

+0

ええ、あなたがそれを指摘するまで気付かなかったのです。 :) – oljones

答えて

7

これは、あなたの正規表現の内部にあると思った一重引用符があるためですが、シェルはそのことを知らないからです。

perl -nle 'print for m/\* Members= (\w+([-+.'\'']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)*$/i)/g' 

'\''はシングルで単一引用符を埋め込む:あなたは'\''トリックを使用する必要があり、より一般的に

perl -nle "print for m/\* Members= (\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)*$/i)/g" 

:この時間は、あなたはPerlの式を二重引用符で逃げることができますシェルの引用符付き文字列。最初の引用符は現在の単一引用符で囲まれた文字列を閉じます。バックスラッシュの引用符には一重引用符が埋め込まれています。最後の引用符は新しい一重引用符で囲まれた文字列を開始します。

+0

うーん...今私は得ている:比類のない)正規表現で;メンバー名=(\ - )\ w +([ - 。\])\ w +([ - 。] \ w +)* \。 -e line 1のところにあります。 – oljones

+1

@oljones:これはあなたが本当にあなたのパターンの中に '' '' ''を持っているからです。余分なものがコピー&ペーストが多すぎるかどうか、あるいは '\)'であると思われる場合は何か、あるいは何かを確認する必要があります。 – ruakh

1

問題は最初の論理グループにあります。 'はあなたが望む前にあなたの評価する文字列を閉じています。

perl -nle 'print for m/\* Members= (\w+([-+.' <-- that character 

他の人が代わりに'"を使用し、言ったように"

perl -nle "print for m/\* Members= (\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)*$/i)/g" 
+0

上記と同じエラー...正規表現では「不一致」です。メンバー名=(\ - )\ w +([ - 。\])\ w +([ - 。] \ w +)* \。 )*)*([、])*)< - HERE * $/at -e line 1.' – oljones

+0

一重引用符で囲まれた文字列の中に一重引用符をエスケープする方法はありません。 –

1

を使用してみてください。

そして、別のエラーがあなたの正規表現の末尾にあります:

([,])*)*$/i)/g 

が書かれている必要があります

(,)*$/ig 

私はあなたの正規表現は、あなたがやりたいことはよく分からない、いくつかの行を表示してくださいあなたに良い答えを与えるためにファイルの

関連する問題