0

コマンドラインの複数のファイルの検索と置換で提供される回答を使用して、UNIXコマンドラインからすべてのファイルで複雑な検索と置換を実行しようとしていますが、検索と置換の文字列を適切にエスケープできないようです。

次を含むすべての行を見つける必要があります。

if ($session['test']>0){

そしてそれを

if ($session['test']>1){

私が試しているコマンドは次のとおりです。

find . -name '*.php' |xargs perl -pi -e 's/if\(\$session\[\'test\'\]\>0\){/if\(\$session\[\'test\'\]\>1\){/g'

しかし'、コマンドが終了していない文字列があることを通知するため、追加の文字を入力する必要がある別のプロンプトが表示されます。'最後に追加すると、次のようになります。

Unmatched ) in regex; marked by <-- HERE in m/if\(\$session\[\test']>0) <-- HERE {/ at -e line 1.

この代替品を機能させるにはどうすればよいですか?

4

2 に答える 2

2

Using double quotes and double escaping the $ works:

perl -pi -e "s/if \(\\\$session\['text'\]>0\){/if (\\\$session['text']>1){/"

A shorter but dirtier solution with a look-behind and look-ahead assertions:

perl -pi -e 's/(?<=if \(\$session\[.text.\]>)0(?=\){)/1/'
于 2013-03-08T17:27:59.893 に答える
2

二重引用符を使用するだけです:

perl -pi -e "s/if\(\$session\[\'test\'\]\>0\){/if\(\$session\[\'test\'\]\>1\){/g"

さらに、後ろにスペースがなくif、ドル記号を 3 つのバックスラッシュでエスケープする必要があります。

perl -pi -e "s/if \(\\\$session\[\'test\'\]\>0\){/if \(\\\$session\[\'test\'\]\>1\){/g"
                 ^  ^^^                                ^^^
于 2013-03-08T17:16:01.217 に答える