grep 및/또는 sed를 사용하여 xml 파일에서 여러 줄의 텍스트를 추출하는 방법

grep 및/또는 sed를 사용하여 xml 파일에서 여러 줄의 텍스트를 추출하는 방법

원하는 텍스트 <w:t>앞과 끝의 일부 줄을 추출하려고 하는데 </w:t>마지막 태그의 텍스트만 가져오고 다른 태그는 가져오지 않습니다. 어떻게 해야 하나요?

이것은 내가 사용하려고 했던 코드입니다:

grep '<w:t>' word/document.xml | sed 's/.*<w:t>\(.*)<\/w:t>.*/\1/' | cat > brev.txt

보시다시피 단어 디렉터리에 있는 파일 grep에서 document.xml파일의 태그를 찾아 이라는 파일로 전송하고 있는데 brev.txt제대로 작동하지 않습니다. 레이블이 있는 마지막 행뿐만 아니라 모든 행을 얻으려면 어떻게 해야 합니까?

파일 document.xml은 한 줄의 텍스트 파일입니다(차이가 있는 경우).

또한 다른 코드를 시도했는데 첫 번째 <w:t>태그부터 마지막 ​​태그까지 </w:t>모든 것이 제공되었습니다. 여기에는 추가 텍스트가 많이 있습니다. 다음 코드는 다음과 같습니다.

grep -o '<w:t>.*</w:t>' word/document.xml | sed 's/\(<w:t>\|<\/w:t>\)//g' > brev.txt

샘플 파일(가독성을 위해 형식화됨, 원본 파일은 한 줄임)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex" xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex" xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex" xmlns:cx6="http://schemas.microsoft.com/office/drawing/2016/5/12/chartex" xmlns:cx7="http://schemas.microsoft.com/office/drawing/2016/5/13/chartex" xmlns:cx8="http://schemas.microsoft.com/office/drawing/2016/5/14/chartex" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink" xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se w16cid wp14">
  <w:body>
    <w:p w14:paraId="35B527D8" w14:textId="4CF0BDCB" w:rsidR="0068138C" w:rsidRDefault="00BF1E48">
      <w:r>
        <w:t>Here’s a Word document. It has several sentences.</w:t>
      </w:r>
    </w:p>
    <w:p w14:paraId="4AADFADF" w14:textId="4F49E2CE" w:rsidR="00BF1E48" w:rsidRDefault="00BF1E48">
      <w:r>
        <w:t>Most are short.</w:t>
      </w:r>
    </w:p>
    <w:p w14:paraId="608ED30C" w14:textId="2163C420" w:rsidR="00BF1E48" w:rsidRDefault="00BF1E48">
      <w:r>
        <w:t>All are in English.</w:t>
      </w:r>
    </w:p>
    <w:p w14:paraId="0B67C683" w14:textId="77777777" w:rsidR="00BF1E48" w:rsidRDefault="00BF1E48">
      <w:bookmarkStart w:id="0" w:name="_GoBack"/>
      <w:bookmarkEnd w:id="0"/>
    </w:p>
    <w:sectPr w:rsidR="00BF1E48">
      <w:pgSz w:w="11906" w:h="16838"/>
      <w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="708" w:footer="708" w:gutter="0"/>
      <w:cols w:space="708"/>
      <w:docGrid w:linePitch="360"/>
    </w:sectPr>
  </w:body>
</w:document>

답변1

XML 파서를 사용하여 XML을 구문 분석합니다. 귀하의 질문에 추가한 예제 문서를 사용하여,

xmlstarlet sel -t -v '//w:t' -n word/document.xml >brev.txt

cat brev.txt
Here’s a Word document. It has several sentences.
Most are short.
All are in English.

XML 파서를 실제로 사용할 수 없지만 GNU가 있는 경우 grep이 모드를 사용할 수 있습니다. 하지만 이는 문제를 해결하는 잘못된 방법입니다.

grep -oP '(?<=<w:t>).*?(?=</w:t>)' word/document.xml

관련 정보