원하는 텍스트 <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