Come si scambiano due schemi con `sed`?


0

sto usando sed comando di cambiare <active>true a <active>false in un file xml. Ora se lo uso

sed 's/<active>true/<active>false/g' file.xml > file.xml

cancella completamente il contenuto del mio file. Durante l'utilizzo >> invece di >, aggiunge l'output alla fine come dovrebbe fare.

  1. Come ottenere ciò che voglio fare?
  2. Perché è > comportarsi così stranamente?
  3. Quello che in realtà voglio fare è cambiare <active>true a <active>false Se <active>true è presente e viceversa se <active>false è presente nel file. C'è qualche comando che può farlo o ho bisogno di scrivere uno script con if-else come il mio piano originale?

1
2: Questa risposta . indagare sed -i.
Kamil Maciorowski

@ KamilMaciorowski quindi insomma file.xml è stato troncato prima sed è stato eseguito?
monster

1
Sì. In Linux c'è uno strumento generale per evitare questo: sponge.
Kamil Maciorowski

Grazie, sed -i risolto problema 2 e 1, anche se su utilizzando spugna, ha dato command not found errore
monster

In Debian o Ubuntu sponge è una parte di moreutils pacchetto che non è installato di default. Immagino che in altre distro la situazione sia simile.
Kamil Maciorowski

Risposte:


1

Il comportamento di > è spiegato in questo Unix & amp; Risposta per Linux SE . L'esempio c'è cat test.txt > test.txt e la spiegazione è:

La prima cosa che succede è bash test.txt, che tronca il file. Ora è vuoto, prima cat viene eseguito con test.txt come argomento.

Il tuo sed '…' file.xml > file.xml innesca lo stesso comportamento.

Abbastanza semplice soluzione con un singolo sed:

sed -i 's/<active>true/<active>DUMMY/g
   s/<active>false/<active>true/g
   s/<active>DUMMY/<active>false/g' file.xml

Il -i opzione risolve il tuo problema con il file che viene troncato. Il comando gira <active>true in <active>false e viceversa. Nota che non puoi usare solo

s/<active>true/<active>false/g;s/<active>false/<active>true/g

perché la seconda parte non può dire se c'è ne false è l'originale false o l'originale true appena trasformato in false. Questo causa ogni abbinamento true o false finire come true. Per questo motivo ho usato il temporaneo DUMMY sostituzione. Forse c'è un modo migliore per farlo, non lo so ancora.

L'unica condizione è la stringa <active>DUMMY non può apparire nel file originale. Se può apparire, usa un'altra stringa fittizia che non appare di sicuro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.