Bir öznitelik değeriyle eşleşen tüm bir öğeyi kaldırmak için xmlstarlet kullanılsın mı?

Jan 01 2021

Sorum sed'e benzer - Belirli bir öğeyi içeren XML düğümünü silin - Unix ve Linux Stack Exchange . Oradaki önerileri uygulamaya çalışmak beni bütün gün meşgul etti, ancak işe yarayacak hiçbir şey bulamadım, bu yüzden bir soru gönderiyorum.

Bir bash komut dosyası içinde <folder>, idöznitelik belirli bir değerle eşleştiğinde tüm bir öğeyi kaldırmam gerekir . Aslında bunun bir kısmını yapmak için kullanıcı gruplarını kullanıyorum. Bir kullanıcının grupta olmadığını söyleyin folder_a; daha sonra <folder>özniteliğe sahip tüm öğe id=".Folder_A"config.xml'den silinmelidir. (Klasörü diskten de siliyorum.)

Benim bash betiğim şöyle görünüyor:

#!/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 komutu edilir değil çalışma. Denediğim birçok varyanttan sadece biri. Ben de sed denedim. Xmlstarlet kullanmayı tercih ederdim ama daha çok sorun yaşadım.

Düzenle - Bu yanıtı yeni buldum:https://unix.stackexchange.com/a/339089/393289 Bunu bulmama yardımcı oldu:

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

Şimdi daha yakın olduğumu hissediyorum. (Bu yanıtı yükseltmeye çalıştım ama henüz yeterli temsilcim yok.) Ancak, tırnak işaretleri veya başka bir şey nedeniyle öznitelik adını henüz bir bash değişkenine çeviremiyorum.

BTW, çalıştırdığımda bunun yerinde düzenleme ( sed -ikomuta benzer ) gerçekleştirmesini nasıl sağlayabilirim ?

Örnek bir config.xml dosyası:

    <?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>

Bu, senkronizasyon için bir config.xml örneğidir.

Yanıtlar

1 Freddy Jan 01 2021 at 10:10

-L/ --inplaceSeçeneğini (bakın xml edit --help) ve bağlantılı yanıttan tam eşleşmeyi kullanın :

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