複雑な文字列の置換 - 複数のファイル、複数の異なる文字列には特定のテキストを含める必要があります。

複雑な文字列の置換 - 複数のファイル、複数の異なる文字列には特定のテキストを含める必要があります。

行が設定された文字列で始まる限り、特定の文字列を置き換えるために解析する必要があるXMLファイル(Atlassian Confluenceスペースのエクスポートを参照)がたくさんあります。

以下は、解析して変更する必要がある行の例です。

<ac:structured-macro ac:name="jira" ac:schema-version="1" ac:macro-id="4dacac64-1234-8dd4-badd-acdfddf208d4"><ac:parameter ac:name="server">Jira Server Name</ac:parameter><ac:parameter ac:name="columns">key,summary,assignee,reporter,status</ac:parameter><ac:parameter ac:name="maximumIssues">20</ac:parameter><ac:parameter ac:name="jqlQuery">project = SOMECODE and issuetype = IssueType and &quot;SomeOtherThing&quot; != ExtraThing </ac:parameter><ac:parameter ac:name="serverId">6adef236-9999-66a6-72bc-e87a4cc03c47</ac:parameter></ac:structured-macro>

交換する必要がある2つは次のとおりです。

  • <ac:parameter ac:name="serverId">
  • <ac:parameter ac:name="server">

代替値を必要とするすべての行は、次から始まります。

<ac:structured-macro ac:name="jira"

一致して置き換える必要がある「serverId」と「server」にはいくつかの値があります。

正規表現で操作しようとしましたが、「serverId」と「server」のすべての他の値を取得するために、次sedの正規表現を追加する方法はわかりません。(.*?)

この2行のsedは私が得たものの中で最も近いですが、今回もサーバー値(「Jira Server Name」など)とサーバーID値(6adef236-9999-66a6-72bcなど)を「ファジーマッチ」できる必要があります。 -e87a4cc03c47)

  • sed -i -e '/<ac:structured-macro ac:name="jira"/s~\(<ac:parameter ac:name="server">\)Jira Server Name\(</ac:parameter>\)~\1Replacement Server Name\2~' entities.xml

  • sed -i -e '/<ac:structured-macro ac:name="jira"/s~\(<ac:parameter ac:name="serverId">\)6adef236-9999-66a6-72bc-e87a4cc03c47\(</ac:parameter>\)~\16c3d2a6e-1234-95cb-33f3-b11a8ff01c44\2~' entities.xml

複数の異なるID /名前を一致させて置き換えることができるように、sedコマンドでserverIDとservernameの値を「ワイルドカード」としてどのように指定しますか?

sed仕事に適したツールですか?これを行う別の/より簡単な方法はありますか?


考慮すべき実際のXMLファイル:

<jira>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">12334762</id>
<property name="body"><![CDATA[<h1>Links</h1><p><ac:structured-macro ac:name="jira" ac:schema-version="1" ac:macro-id="a0d29f31-1212-4234-abcd-9ba23456f8cf"><ac:parameter ac:name="server">JIRA SERVER NAME</ac:parameter>6123450c-1234-acdb-8123-33333397828b</ac:parameter><ac:parameter ac:name="key">ABC-272</ac:parameter></ac:structured-macro></p><h1>Files</h1><p><ac:structured-macro ac:name="attachments" ac:schema-version="1" ac:macro-id="4f911234-1234-1234-1234-12345aad9b77" /></p>]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">443449761</id>
</property>
<property name="bodyType">2</property>
</object>
<object class="OutgoingLink" package="com.atlassian.confluence.links">
<id name="id">931112345</id>
<property name="destinationPageTitle"><![CDATA[some thing]]></property>
<property name="lowerDestinationPageTitle"><![CDATA[some thing]]></property>
<property name="destinationSpaceKey"><![CDATA[https]]></property>
<property name="lowerDestinationSpaceKey"><![CDATA[https]]></property>
<property name="sourceContent" class="Page" package="com.atlassian.confluence.pages"><id name="id">943325975</id>
</property>
<property name="creator" class="ConfluenceUserImpl" package="com.atlassian.confluence.user"><id name="key"><![CDATA[1234567890]]></id>
</property>
<property name="creationDate">2018-10-10 07:02:45.817</property>
<property name="lastModifier" class="ConfluenceUserImpl" package="com.atlassian.confluence.user"><id name="key"><![CDATA[1234567890]]></id>
</property>
<property name="lastModificationDate">2018-10-10 07:02:45.817</property>
</object>
<object class="Page" package="com.atlassian.confluence.pages">
<id name="id">123457845</id>
<property name="hibernateVersion">10</property>
<property name="title"><![CDATA[20170428 - somehing]]></property>
<property name="lowerTitle"><![CDATA[20170428 - somehing]]></property>
<collection name="bodyContents" class="java.util.Collection"><element class="BodyContent" package="com.atlassian.confluence.core"><id name="id">1234567</id>
</element>
</collection>
<collection name="contentProperties" class="java.util.Collection"><element class="ContentProperty" package="com.atlassian.confluence.content"><id name="id">1234567</id>
</element>
<element class="ContentProperty" package="com.atlassian.confluence.content"><id name="id">123456748</id>
</element>
<element class="ContentProperty" package="com.atlassian.confluence.content"><id name="id">123456749</id>
</element>
<element class="ContentProperty" package="com.atlassian.confluence.content"><id name="id">123456750</id>
</element>
<element class="ContentProperty" package="com.atlassian.confluence.content"><id name="id">123456751</id>
</element>
</collection>
<property name="version">1</property>
<property name="creator" class="ConfluenceUserImpl" package="com.atlassian.confluence.user"><id name="key"><![CDATA[1234567890]]></id>
</property>
<property name="creationDate">2018-09-20 04:52:30.727</property>
<property name="lastModifier" class="ConfluenceUserImpl" package="com.atlassian.confluence.user"><id name="key"><![CDATA[1234567890]]></id>
</property>
<property name="lastModificationDate">2018-09-20 04:57:08.072</property>
<property name="versionComment"><![CDATA[]]></property>
<property name="originalVersion" class="Page" package="com.atlassian.confluence.pages"><id name="id">878936102</id>
</property>
<property name="originalVersionId">878936102</property>
<property name="contentStatus"><![CDATA[current]]></property>
<property name="position">2143289343</property>
</object>
<object class="BodyContent" package="com.atlassian.confluence.core">
<id name="id">443449754</id>
<property name="body"><![CDATA[<h1>Links</h1><p><ac:structured-macro ac:name="jira" ac:schema-version="1" ac:macro-id="a0d29f31-acdb-1234-1234-12345ffff8cf"><ac:parameter ac:name="server">JIRA SERVER NAME</ac:parameter>6123450c-1234-acdb-8123-33333397828b</ac:parameter><ac:parameter ac:name="key">ABC-272</ac:parameter></ac:structured-macro></p><h1>Files</h1><p><ac:structured-macro ac:name="attachments" ac:schema-version="1" ac:macro-id="abcd1236-1234-1234-1234-abcd3aa12345" /></p>]]></property>
<property name="content" class="Page" package="com.atlassian.confluence.pages"><id name="id">443613611</id>
</property>
<property name="bodyType">2</property>
</object>
</jira>

ベストアンサー1

あなたの質問を正しく理解したら、名前やIDに固有のパターンを使用してください。フィールドには次のオープンまでのすべての内容が含まれているため、<これは簡単なはずです。

sed -i -e '/<ac:structured-macro ac:name="jira"/s~\(<ac:parameter ac:name="server">\)[^<]*\(</ac:parameter>\)~\1Replacement Server Name\2~' entities.xml

[^<]*を除くすべての文字と一致します<

これは対応する入力に対してのみ機能します。理論的には、xmlファイルには、xml構文を理解していないスクリプトを破損する改行文字やその他の内容を含めることができます。もしそうなら、Pythonスクリプトのようなものを使用する方が良いでしょう。import xml.etree.ElementTree

おすすめ記事