2

perl ワンライナーを使用して、ファイル内のパターンの最初の出現のみを置き換えようとしています。

>touch tmp
>perl -p -i.bak -e '++$seen if( !$seen && s/alpha/beta/);' tmp

この後、Enter キーを押します。以下のメッセージが画面に表示されます。

perl -p -i.bak -e '++$seen if( tmpseen && s/alpha/beta/);' tmp

!$seenに置き換えられたことに注意してくださいtmpseen

なぜこうなった?

ありがとう。

4

2 に答える 2

4

kjprice が述べたように !$ はシェルによって展開されます。考えられる解決策の 1 つは、演算子 ! の代わりに演算子 'not' を使用することです。

perl -p -i.bak -e '++$seen if( (not $seen) && s/alpha/beta/);' tmp

演算子「not」の優先順位が低いため、括弧があります

于 2013-03-27T16:27:02.483 に答える
3

次のコマンドを使用して、csh の特殊文字をエスケープできます\

 perl -p -i.bak -e '++$seen if( \!$seen && s/alpha/beta/);' tmp
于 2013-03-27T16:28:06.090 に答える