줄이 설정된 문자열로 시작하는 한 특정 문자열을 대체하기 위해 구문 분석해야 하는 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 "SomeOtherThing" != ExtraThing </ac:parameter><ac:parameter ac:name="serverId">6adef236-9999-66a6-72bc-e87a4cc03c47</ac:parameter></ac:structured-macro>
교체해야 할 두 가지는 다음과 같습니다.
<ac:parameter ac:name="serverId">
<ac:parameter ac:name="server">
대체 값이 필요한 모든 줄은 다음으로 시작됩니다.
<ac:structured-macro ac:name="jira"
일치하고 교체해야 하는 "serverId" 및 "server"에 대한 여러 가지 값이 있습니다.
정규식으로 작업을 시도했지만 "serverId" 및 "server"에 대한 모든 다른 값을 얻기 위해 sed
다음과 같은 정규식을 추가하는 방법을 알 수 없습니다 .(.*?)
이 두 줄의 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