1

コマンド ラインから perl regex 操作を使用して (Linux で) ファイルを変更していますが、ファイルの変更に失敗する理由を知りたいです。正規表現は次のとおりです。

perl -i -pe 'undef $/; s#(<web-app[^>]*>).*?(</web-app>)#\1CHEESE\n\2#gsi' filePath/web.xml

これで、複数行のブロックが正しく一致する必要があります。しかし、そうではありません。サンプル入力:

<web-app xmlns= "http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
<stuff goes here and tags and things>
</web-app>

ただし、何も変更されません。Dotall は一致する必要があり、これはオンラインの正規表現テスト ツールでは機能しますが、Perl では失敗します。私は何を間違っていますか?

4

2 に答える 2

7

ファイル全体を一度に読み取って置換したい場合、-0777パラメータはまさにそれを行います。

perl -i -0777 -pe 's#(<web-app[^>]*>).*?(</web-app>)#\1CHEESE\n\2#gsi' filePath/web.xml

以前$/は、最初の行が既に読み取られたときに設定されていたため、正規表現は部分的なコンテンツと一致できませんでした。

于 2013-05-31T16:26:25.507 に答える
2

このオプションを使用する-pと、スクリプトはwhile (<>)ループの本体内にあります。そのundef $/;ため、ループに入るまで実行されません。したがって、最初の反復では入力の最初の行が処理され、2 番目の反復では残りの入力が処理されます。

BEGINブロックを使用して、ループの前にコードを挿入できます。

perl -i -pe 'BEGIN {undef $/;} s#(<web-app[^>]*>).*?(</web-app>)#\1CHEESE\n\2#gsi' filePath/web.xml
于 2013-05-31T16:33:16.450 に答える