複数の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>