파일에서 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
...하지만 이 모든 작업은 !를 사용하여 더 우아하고 안정적으로 수행할 수 있을 것 같습니다.