xmlstarlet을 사용하여 속성 값과 일치하는 전체 요소를 제거 하시겠습니까?

Jan 01 2021

내 질문은 특정 요소를 포함하는 sed-Delete XML 노드-Unix 및 Linux Stack Exchange 와 유사합니다 . 거기에 제안을 구현하려고 노력하면서 하루 종일 바빴지만 아무것도 작동하지 않아서 질문을 게시하고 있습니다.

bash 스크립트 내 <folder>에서 id속성이 주어진 값과 일치 할 때 전체 요소 를 제거해야 합니다. 실제로이 작업의 일부를 수행하기 위해 사용자 그룹을 사용하고 있습니다. 사용자가 그룹에 없다고 가정합니다 folder_a. 그런 다음 <folder>속성 id=".Folder_A"이있는 전체 요소 를 config.xml에서 삭제해야합니다. (또한 디스크에서 폴더를 삭제합니다.)

내 bash 스크립트는 다음과 같습니다.

#!/bin/bash

grouplist=$(groups $theuser);
for foldername in '.Folder_A' '.Folder_B'; do
  grpnm="${foldername,,}"|sed -e 's/^.//' if ! [[ $grouplist =~ ${grpnm} ]]; then perl -0777 -pe "s|(<folder.*?</folder>)|$1=~ /id=\"$foldername\"/?"":$1|gse" config.xml > config.xml
    rm -fr "$foldername" else echo "permitting access to ${foldername}"
  fi
done

perl 명령이 작동 하지 않습니다 . 내가 시도한 많은 변형 중 하나입니다. 나는 또한 sed를 시도했다. xmlstarlet을 사용하고 싶지만 더 많은 문제가 발생했습니다.

편집 -방금이 답변을 찾았습니다.https://unix.stackexchange.com/a/339089/393289 그것은 내가 이것을 생각해내는 데 도움이되었습니다.

xml ed -d '//configuration/folder[contains(@id,".Folder_A")]' config.xml

이제 더 가까워진 것 같습니다. (나는 그 대답을 찬성하려고했지만 아직 충분한 담당자가 없습니다.) 그러나 따옴표 또는 다른 이유로 아직 속성 이름을 bash 변수로 변환 할 수 없습니다.

BTW, sed -i일단 작동되면 내부 편집 ( 명령 과 유사)을 수행하려면 어떻게해야 합니까?

다음은 config.xml 파일의 예입니다.

    <?xml version="1.0"?>
    <configuration version="32">
        <folder id=".Folder_A" label=".Folder_A" path="~/Sync/.Folder_A" type="sendreceive" rescanIntervalS="3600" fsWatcherEnabled="true" fsWatcherDelayS="10" ignorePerms="false" autoNormalize="true">
            <filesystemType>basic</filesystemType>
            <device id="123ABC" introducedBy="">
                <encryptionPassword/>
            </device>
            <device id="987ZYX" introducedBy="">
                <encryptionPassword/>
            </device>
            <minDiskFree unit="">0</minDiskFree>
            <versioning>
                    <cleanupIntervalS>0</cleanupIntervalS>
            </versioning>
            <copiers>0</copiers>
            <disableSparseFiles>false</disableSparseFiles>
            <disableTempIndexes>false</disableTempIndexes>
            <paused>false</paused>
            <weakHashThresholdPct>25</weakHashThresholdPct>
            <markerName>.stfolder</markerName>
        </folder>
        <folder id=".Folder_B" label="Corporate (.Folder_B)" path="~/Sync/.Folder_B" type="sendreceive" rescanIntervalS="3600" fsWatcherEnabled="true" fsWatcherDelayS="5" ignorePerms="true" autoNormalize="false">
            <filesystemType>basic</filesystemType>
            <device id="123ABC" introducedBy="">
                <encryptionPassword/>
            </device>
            <device id="987ZYX" introducedBy="">
                <encryptionPassword/>
            </device>
            <minDiskFree unit="">0</minDiskFree>
            <versioning>
                    <cleanupIntervalS>0</cleanupIntervalS>
            </versioning>
            <copiers>0</copiers>
            <disableSparseFiles>false</disableSparseFiles>
            <disableTempIndexes>false</disableTempIndexes>
            <paused>false</paused>
            <weakHashThresholdPct>25</weakHashThresholdPct>
            <markerName>.stfolder</markerName>
        </folder>
        <device id="123ABC" name="laptop" compression="always" introducer="false" skipIntroductionRemovals="false" introducedBy="">
            <paused>false</paused>
            <autoAcceptFolders>true</autoAcceptFolders>
            <maxSendKbps>0</maxSendKbps>
            <maxRecvKbps>0</maxRecvKbps>
            <maxRequestKiB>0</maxRequestKiB>
            <untrusted>false</untrusted>
        </device>
        <device id="987ZYX" name="desktop" compression="always" introducer="false" skipIntroductionRemovals="false" introducedBy="">
            <paused>false</paused>
            <autoAcceptFolders>true</autoAcceptFolders>
            <maxSendKbps>0</maxSendKbps>
            <maxRecvKbps>0</maxRecvKbps>
            <maxRequestKiB>0</maxRequestKiB>
            <untrusted>false</untrusted>
        </device>
        <gui enabled="true" tls="true" debugging="false">
            <address>127.0.0.1:8384</address>
            <apikey>98qewr0qe9r</apikey>
            <theme>default</theme>
        </gui>
        <ldap/>
        <options>
            <listenAddress></listenAddress>
            <maxSendKbps>0</maxSendKbps>
            <maxRecvKbps>0</maxRecvKbps>
            <reconnectionIntervalS>60</reconnectionIntervalS>
            <relaysEnabled>false</relaysEnabled>
            <relayReconnectIntervalM>10</relayReconnectIntervalM>
            <startBrowser>false</startBrowser>
            <urAccepted>-1</urAccepted>
            <urSeen>3</urSeen>
            <urUniqueID/>
            <urPostInsecurely>false</urPostInsecurely>
            <urInitialDelayS>1800</urInitialDelayS>
            <restartOnWakeup>true</restartOnWakeup>
            <upgradeToPreReleases>false</upgradeToPreReleases>
            <keepTemporariesH>24</keepTemporariesH>
            <cacheIgnoredFiles>false</cacheIgnoredFiles>
            <progressUpdateIntervalS>5</progressUpdateIntervalS>
            <limitBandwidthInLan>false</limitBandwidthInLan>
            <overwriteRemoteDeviceNamesOnConnect>false</overwriteRemoteDeviceNamesOnConnect>
            <tempIndexMinBlocks>10</tempIndexMinBlocks>
            <trafficClass>0</trafficClass>
            <defaultFolderPath>~/Sync/</defaultFolderPath>
            <maxFolderConcurrency>0</maxFolderConcurrency>
            <crashReportingEnabled>false</crashReportingEnabled>
            <databaseTuning>auto</databaseTuning>
            <maxConcurrentIncomingRequestKiB>0</maxConcurrentIncomingRequestKiB>
            <announceLANAddresses>false</announceLANAddresses>
            <sendFullIndexOnUpgrade>false</sendFullIndexOnUpgrade>
        </options>
    </configuration>

이것은 동기화를위한 config.xml 예제입니다.

답변

1 Freddy Jan 01 2021 at 10:10

사용 -L/의 --inplace옵션 (참조 xml edit --help)와 링크 된 대답에서 일치를 :

xml ed -L -d "//configuration/folder[@id=\"$foldername\"]" config.xml