Spring(Spring Bootではない)アプリケーションでSpringSessionを実装したため、Tomcatセッションの永続性を無効にする必要があります。
context.xmlファイル内の複数行を編集するためにsedとperlを試しましたが、どちらも機能しませんでした。次のことを試しましたが、エラーは発生しませんが、実際には何もしません。
sed -i 's/<!--\n<Manager pathname=\"\" \/>\n-->/<Manager pathname="" \/>/' /opt/tomcat/conf/context.xml
perl -i -0pe 's/<!--\n<Manager pathname="" \/> \n-->/<Manager pathname="" \/>/' /opt/tomcat/conf/context.xml
デフォルトでは、context.xmlでManagerのパス名行のコメントを解除したいと思います。
私は変更したい:
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
到着
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<Manager pathname="" />
ベストアンサー1
sed
perl
あなたの質問は基本的にオンラインで行われます。したがって、基本的に入力内容が一致することは不可能です。 2つの一般的な解決策は、ファイル全体を一度に操作するか、1行ずつ動作しますが、表示される内容を追跡するステートマシンを使用することです。完全なファイル方法はファイル内のデータを探し、必要なinput
ビットだけを保持します。
$ perl -0777 -ple 's{<!--\s*(<Manager pathname="" />)\s*-->}{$1}' input
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<Manager pathname="" />
$
ステートマシンのアプローチはより複雑です。邪魔されずに残る必要がある他のコメントがある可能性があり、パターンが反対の場合、EOFはその行が私たちが望む行でない限り、以前に見た行を印刷する必要があります。 、この場合、次の行もスキップされます。理想的には、単体テストがそのようなコードで発生する可能性があるすべての極端なケースに対処したいと思います。
$ perl -nle 'if (m{<Manager pathname="" />}) { readline } else { print $prev } $prev=$_; END{ print $prev }' input
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<Manager pathname="" />
$
diff
編集内容が必要な部分だけが変更されたことを確認するために、後で行う必要があるかもしれません。その後、patch
その違いをファイルの将来のバージョンに適用するために使用できます。これは、ファイルをパッチできないという警告といくつかの回復方法があるという利点があります。少し異なるファイル。
$ perl -i.old ..
$ diff input.old input > input.patch
3番目のアプローチは、XMLをメモリ内ツリー形式に完全に解析し、ツリーを目的の新しい状態に操作し、新しい形式をエクスポートすることです。これは、上記の正規表現が一致しないようにする任意のスペースやその他のバリエーションによってバグが発生する可能性が低いという利点があります(つまり、上記のアプローチはより脆弱です)、設定はより複雑でパーサーによって異なります。 。使用とエミッタは、入力ファイルに不要な変更をもたらす可能性があります。