विशेषता मान से मेल खाने वाले संपूर्ण तत्व को निकालने के लिए xmlstarlet का उपयोग करें?
मेरा प्रश्न sed के समान है - कुछ निश्चित तत्व वाले XML नोड को हटाएं - Unix & Linux Stack Exchange । वहाँ सुझावों को लागू करने की कोशिश ने मुझे पूरे दिन व्यस्त रखा है, लेकिन मैं काम करने के लिए कुछ भी प्राप्त करने में कामयाब नहीं हुआ, इसलिए मैं एक प्रश्न पोस्ट कर रहा हूं।
बैश स्क्रिप्ट के भीतर, मुझे एक संपूर्ण <folder>
तत्व को निकालने की आवश्यकता होती है जब id
विशेषता किसी दिए गए मूल्य से मेल खाती है। मैं वास्तव में इसका हिस्सा करने के लिए उपयोगकर्ता-समूहों का उपयोग कर रहा हूं। कहते हैं कि एक उपयोगकर्ता समूह में नहीं है folder_a
; उसके बाद <folder>
विशेषता वाला पूरा तत्व id=".Folder_A"
config.xml से हटा दिया जाना चाहिए। (मैं फ़ोल्डर को डिस्क से भी हटाता हूं।)
मेरी बैश स्क्रिप्ट इस तरह दिखती है:
#!/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
पर्ल कमांड काम नहीं कर रहा है। यह मेरे द्वारा आजमाए गए कई रूपों में से एक है। मैंने भी सेड की कोशिश की। मैं xmlstarlet का उपयोग करना पसंद करूंगा, लेकिन मुझे इससे और भी अधिक परेशानी हुई।
संपादित करें - मुझे यह उत्तर मिला:https://unix.stackexchange.com/a/339089/393289 इसने मुझे इसके साथ आने में मदद की:
xml ed -d '//configuration/folder[contains(@id,".Folder_A")]' config.xml
मुझे लगता है कि मैं अब करीब हूं। (मैंने उस उत्तर को उकेरने की कोशिश की, लेकिन मेरे पास अभी तक पर्याप्त प्रतिनिधि नहीं है।) हालांकि, मैं बोली नाम या कुछ और के कारण अभी तक एक बश चर में विशेषता नाम का अनुवाद नहीं कर सकता।
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>
यह syncthing के लिए एक config.xml उदाहरण है।
जवाब
लिंक किए गए उत्तर से -L
/ --inplace
विकल्प (देखें xml edit --help
) और सटीक मिलान का उपयोग करें :
xml ed -L -d "//configuration/folder[@id=\"$foldername\"]" config.xml