使用 sed 或 perl 禁用 Tomcat 会话持久性

使用 sed 或 perl 禁用 Tomcat 会话持久性

我需要禁用 Tomcat 会话持久性,因为我已经在 Spring(不是 Spring Boot)应用程序上实现了 SpringSession。

我尝试使用 sed 和 perl 编辑 context.xml 文件中的多行,但它们都不起作用。我已经尝试过以下操作,不会引发任何错误,但实际上没有执行任何操作:

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

sedperl默认在线操作;你的问题涉及多行。因此,默认情况下您的输入不可能匹配。两种常见的解决方法是立即对整个文件进行操作,或者使用按行操作但跟踪所看到内容的状态机。整个文件方法,在文件中查找数据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="" />
$ 

之后可能应该进行Adiff操作,以确认编辑仅更改了所需的内容,然后可能patch用于将该差异应用到文件的未来版本,这具有警告无法修补文件的优点以及一些恢复方法来自略有不同的文件。

$ perl -i.old ..
$ diff input.old input > input.patch

第三种方法是将 XML 完全解析为内存中的树形式,然后将该树操纵到所需的新状态,然后发出该新形式。这样做的优点是不太可能被随机空格或其他导致上述正则表达式不匹配的变化所困扰(也就是说,上述方法更脆弱),但设置起来会更复杂,并且根据所使用的解析器和发射器可能会给输入文件带来不需要的更改。

相关内容