파일에서 머리글과 바닥글을 제거하는 간단한 명령

파일에서 머리글과 바닥글을 제거하는 간단한 명령

파일에서 XML 머리글과 바닥글을 제거하는 명령을 원합니다.

<?xml version="1.0" encoding="UTF-8"?>
<conxml>
<MsgPain001>
    <HashValue>A9C72997C702A2F841B0EEEC3BD274DE1CB7BEA4B813E030D068CB853BCFECA6</HashValue>
    <HashAlgorithm>SHA256</HashAlgorithm>
    <Document>
                ...
    </Document>
    <Document>
                ...
    </Document>
</MsgPain001>
</conxml>

...

정당해져야 한다

<Document>
         ...
    </Document>
    <Document>
          ...
    </Document>

(들여쓰기에 주의하세요. 첫 번째 문서 태그의 들여쓰기를 제거해야 합니다.

이것은 (탐욕스러운) 정규 표현식처럼 들립니다.

<Document>.*</Document>

하지만 개행 문자로 인해 이해가 되지 않습니다.

포함된 문서의 해시를 계산하려면 파이프라인에 이 정보가 필요합니다.

답변1

사용 sed:

 sed -n '/<Document>/,/<\/Document>/ p' yourfile.xml

설명하다:

  • -n침묵 상태 로 유지됩니다 sed. 즉, 전체 파일 내용을 출력하지 않습니다.
  • /pattern/ 찾다지정된 패턴을 포함하는 줄의 경우
  • a,b(쉼표)는 sed실행을 나타냅니다.행동 a에서 까지의 노선에서b(여기서 합계는 위 패턴과 일치하여 정의 a됩니다 )b
  • p대표하다인쇄그리고는행동위와 일치하는 라인에서 실행합니다.

편집하다:앞의 공백을 추가로 제거하려면 <Document>다음을 수행하십시오.

 sed -ne '/ <Document>/s/^ *//' -e '/<Document>/,/<\/Document>/ p' yourfile.xml

답변2

</Document>다음 텍스트 사이에서 텍스트가 삭제되는 것을 방지하려면 <Document>일련의 명령을 사용해야 할 수도 있습니다 sed(위의 Gilles의 설명 참조).

기본적으로 sed전체 파일은 보유 버퍼로 읽혀지고(파일 내용이 한 줄로 처리될 수 있도록) Document추가 처리를 위해 첫 번째와 마지막 태그가 표시됩니다.

# version 1
# marker: HERE
cat file.xml | 
sed -n '1h;1!H;${;g;s/\(<Document>.*<\/Document>\)/HERE\1HERE/g;p;}' | 
sed -n -e '/HERE<Document>/,/<\/Document>HERE/ p' | 
sed -e 's/^ *HERE\(<Document>\)/\1/' -e 's/\(<\/Document>\)HERE *$/\1/'

# version 2    (using the Bash shell)
# marker: $'\001'
cat file.xml | 
sed -n $'1h;1!H;${;g;s/\\(<Document>.*<\\/Document>\\)/\001\\1\001/g;p;}' | 
sed -n -e $'/\001<Document>/,/<\\/Document>\001/ p' | 
sed -e $'s/^ *\001//' -e $'s/\001 *$//' | 
cat -vet

xmlstarlet...하지만 이 모든 작업은 !를 사용하여 더 우아하고 안정적으로 수행할 수 있을 것 같습니다.

관련 정보