여러 개의 XML 파일(아마도 수백 개의 파일)이 포함된 디렉토리에 이라는 필드가 있습니다 <import_url>
. 이 필드의 URL에는 밑줄이 포함될 수 있습니다.
다음 예와 같이 이 밑줄을 하이픈으로 바꾸고 싶습니다.
본질적으로
<import_url>archiv/in_natur/der-beitrag-name.html</import_url>
~해야 한다
<import_url>archiv/in-natur/der-beitrag-name.html</import_url>
Linux 명령줄에서 검색하고 바꾸는 방법은 무엇입니까?
참고로 전체 XML 파일은 다음과 같습니다.
<article id="6577889" type="article">
<author>
<forename>Hans</forename>
<surname>Wurs</surname>
<email>[email protected]</email>
<title></title>
<position></position>
<authorId>23262452</authorId>
</author>
<headline>Der Titel des Beitrags</headline>
<body>
Fringilla placerat elementum ratione? Illum blandit wisi adipisicing at sunt, proin minim. Quibusdam similique soluta, viverra
excepteur sem justo commodo? Congue eiusmod, temporibus doloribus urna pulvinar. Quibusdam elementum ante pretium nostra atque,
</body>
<date>
<createdDate>2020-04-30T10:44:35+00:00</createdDate>
<publishingDate>2020-04-30T00:00:00+00:00</publishingDate>
</date>
<metaDescription>Faucibus quidem quo, nostrud voluptates nunc mollitia curae</metaDescription>
<import_url>archiv/in_natur/der-beitrag-name.html</import_url>
<taxonomy type="channel">
<channel id="Archiv:Natur" parent="Archiv">Natur</channel>
</taxonomy>
</article>
답변1
올바른 형식의 XML 문서가 있는 경우 XML 파서/편집기를 사용하여 수정할 수 있습니다.
소스 파일,/tmp/xml
<article>
<-- other sections omitted -->
<import_url>archiv/in_natur/der-beitrag-name.html</import_url>
</article>
개정하다
xmlstarlet edit --update '/article/import_url' --expr 'translate(., "_", "-")' /tmp/xml
산출
<?xml version="1.0"?>
<article>
<-- other sections omitted -->
<import_url>archiv/in-natur/der-beitrag-name.html</import_url>
</article>
일치는 XPath를 사용하므로 //import_url
원하는 경우 일치시킬 수 있습니다.
--inplace
실제로 파일을 편집하고 싶다면 해당 파일을 추가할 수도 있습니다. 그러나 나는 일반적으로 이것을 권장하지 않습니다. 임시 파일에 쓰고 성공하면 소스를 바꾸는 것이 좋습니다.
답변2
xmlstarlet 솔루션과 유사하게 Saxon의 Gizmo 유틸리티를 사용하여 이를 수행하는 방법은 다음과 같습니다.
java net.sf.saxon.Gizmo -s:/tmp/xml
/>update //import_url translate(., '_', '-')
/>save /tmp/xml
/>quit
https://saxonica.com/documentation/index.html#!gizmo
디렉터리의 모든 파일을 처리하려면 다음 XSLT 3.0 변환을 실행할 수 있습니다.
<xsl:transform version="3.0" expand-text="yes" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="import_url">
<xsl:copy>{translate(., '_', '-')}</xsl:copy>
</xsl:template>
<xsl:template name="xsl:initial-template">
<xsl:for-each select="collection('file:///my/input/directory?recurse=yes')">
<xsl:result-document href="file:///my/output/directory/{tokenize(document-uri(),'/')[last()]}">
<xsl:apply-templates/>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
</xsl:transform>