Sed XML 응답자

Sed XML 응답자

test.xml제 파일에 이 XML 응답자가 있습니다.

<ingressAnnotations>nginx.ingress.kubernetes.io/server-snippet: |
  location @custom_503 {
    return 503 &quot;&lt;html&gt; &lt;head&gt; &lt;meta http-equiv=&apos;Content-Type&apos; content=&apos;text/html; charset=UTF-8&apos;&gt; &lt;style&gt;...&lt;/style&gt;&lt;/head&gt; &lt;body&gt;&lt;img src=&apos;https://www.jenkins.io/images/logos/jenkins-is-the-way/j
enkins-is-the-way.png&apos; width=&apos;200&apos; height=&apos;200&apos; style=&apos;display: block; margin-left: auto; margin-right: auto;&apos; alt=&apos;jenkins&apos;&gt;&lt;center&gt;&lt;h2&gt;Jenkins is sleeping, please go to jenkins.betclic.net and click your Maste
r link to wake him up. It will be available in a few minutes. This is the wait !!!&lt;/h2&gt;&lt;/center&gt;&lt;/body&gt;&lt;/html&gt;&quot;;
  }
  error_page 503 @custom_503;</ingressAnnotations>

파일을 구문 분석하고 내용을 삭제해야 합니다. 이 같은:

<ingressAnnotations></ingressAnnotations>

sed를 통해 어떻게 할 수 있나요? 나는 이것을 시도하고 있습니다 :

sed -i 's/<ingressAnnotations>*<\/ingressAnnotations>/<ingressAnnotations><\/ingressAnnotations>/g' test.xml

하지만 작동하지 않습니다!

답변1

XML 파서를 사용하여 파일을 구문 분석하고 편집할 수 있습니다. 이 명령은 <ingressAnnonations/>문서의 어느 위치에서나 태그와 일치하고 해당 내용을 모두 제거합니다.

xmlstarlet edit --update '//ingressAnnotations' --value '' test.xml

산출

<?xml version="1.0"?>
<ingressAnnotations/>

변환이 예상대로 작동한다고 확신하면 --inplace매개변수(예: 파일을 편집할 수 있는 위치)를 포함합니다.xmlstarlet edit --inplace --update …

답변2

서투르지만 효과적입니다.

$ sed -n '/<ingressAnnotations>/{p; :a; N; /<\/ingressAnnotations>/!ba; s/.*\n//}; p' \
FILENAME | sed -e 's/>.*/>/g' -e 's/.*<\//<\//g' 

위 공식은 다음을 제공합니다.

<ingressAnnotations>
</ingressAnnotations>

편집되었습니다.

패턴 사이의 줄 바꿈을 제거하려면 | sed -e ':a;N;$!ba;s/\n//g'파이프를 추가하십시오.

$ sed -n '/<ingressAnnotations>/{p; :a; N; /<\/ingressAnnotations>/!ba; s/.*\n//}; p' \
FILENAME \
| sed -e 's/>.*/>/g' -e 's/.*<\//<\//g' \
| sed -e :a;N;$!ba;s/\n//g'

관련 정보