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
귀하의 질문에는 기본적으로 온라인으로 운영됩니다 . 따라서 기본적으로 입력 내용이 일치하는 것은 불가능합니다. 두 가지 일반적인 솔루션은 전체 파일을 한 번에 작업하거나 한 줄씩 작동하지만 표시되는 내용을 추적하는 상태 시스템을 사용하는 것입니다. 전체 파일 방법은 파일에서 데이터를 찾고 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을 메모리 내 트리 형식으로 완전히 구문 분석한 다음 트리를 원하는 새 상태로 조작한 다음 새 형식을 내보내는 것입니다. 이는 위의 정규 표현식이 일치하지 않게 만드는 임의의 공백이나 기타 변형으로 인해 버그가 발생할 가능성이 적다는 장점이 있지만(즉, 위의 접근 방식은 더 취약함) 설정이 더 복잡하고 파서에 따라 달라집니다. 사용 및 이미터는 입력 파일에 원치 않는 변경을 가져올 수 있습니다.