2011-02-02 9 views
3

私はこれを正確に何と呼ぶべきかは分かりませんが、2つの1ライナーで問題を再現できました。以下を含むファイル 'test.txtの' から始まってs ///で置換文字列をエスケープするPerlの文字列を円で囲む方法は?

foo 

次のコマンドを実行した後(bashで):

perl -n -e "s/(\w)oo/$1ar/; print;" test.txt 

出力は 'far'

です

しかし、置換文字列を含む変数を導入すると、

perl -n -e '$bar = q($1ar); s/(\w)oo/$bar/; print;' test.txt 

出力は '$1ar'です。

2番目のプログラムでも 'far'が出力され、この回答をGoogleableにしたとするにはどのようなキーワードが必要ですか?

また、2番目のものをs /// eに変更しようとしましたが効果がありません。

編集:これは本当に私が尋ねたかった質問ではありませんでした。これはhereです。

答えて

6

これは(bashで、あなたはあなたの引用符を変更する必要があります)私の作品:

perl -n -e '$bar = "\${1} . ar"; s/(\w)oo/$bar/ee; print;' test.txt 

eeは、テキスト文字列として交換部品を試用版。 perlop(1)を参照してください。

+1

'$ bar =" \ $ 1.ar "'または '$ bar = q($ 1.ar)'で十分です。 '$ bar = q($ 1。" ar ")'は警告をクリーンにする。 – mob

+0

ハハ、これは私のおもちゃのスクリプトでは機能しますが、完全なものではありません(1つの重要な面が取り除かれました)!私はこの質問に答えるのでこれを受け入れ、新しい質問をします。 –

1

私は誰かがより良い何かを一緒に来ることを望んでいますが、これは私の作品:

perl -n -e '$bar=q($1."ar"); s/(\w)oo/eval($bar)/e; print;' test.txt 

私はevalのことができるように「AR」に$1を連結式に$バーを設定していますそれは置換部分(eフラグを使用)にあります。

+0

ああ、@ maxelostの 'ee'メソッドは私のものよりも優雅です。 – cam

1

/ee @maxelostが正しいです。

これはPerlプログラムで動作
$bar = q("${1}ar");
$str = "foo";
$str =~ s/(\w)oo/$bar/ee;
print $str;

ので、私はこれはbashで動作します推測している:ウィンドウ内

perl -e '$bar = q("${1}ar"); s/(\w)oo/$bar/ee; print;' test.txt

perl -e "$bar = q(\"${1}ar\"); s/(\w)oo/$bar/ee; print;" test.txt

関連する問題