sed 또는 perl을 사용하여 Tomcat 세션 지속성을 비활성화합니다.

sed 또는 perl을 사용하여 Tomcat 세션 지속성을 비활성화합니다.

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

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="" />
$ 

diff편집 내용이 필요한 부분만 변경되었는지 확인하기 위해 나중에 수행해야 할 수도 있습니다. 그런 다음 patch해당 차이점을 파일의 향후 버전에 적용하는 데 사용될 수 있습니다. 이는 파일을 패치할 수 없다는 경고와 일부 복구 방법이 있다는 장점이 있습니다. 약간 다른 파일 .

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

세 번째 접근 방식은 XML을 메모리 내 트리 형식으로 완전히 구문 분석한 다음 트리를 원하는 새 상태로 조작한 다음 새 형식을 내보내는 것입니다. 이는 위의 정규 표현식이 일치하지 않게 만드는 임의의 공백이나 기타 변형으로 인해 버그가 발생할 가능성이 적다는 장점이 있지만(즉, 위의 접근 방식은 더 취약함) 설정이 더 복잡하고 파서에 따라 달라집니다. 사용 및 이미터는 입력 파일에 원치 않는 변경을 가져올 수 있습니다.

관련 정보