Come sostituire le virgolette in un file con sed?


10

Ho un file che contiene più righe di XML. Vorrei sostituire alcune parti del file. Alcune parti del file contengono virgolette ( ") che vorrei sostituire. Ho cercato di sfuggire alle virgolette con \, ma non credo che funzioni sulla base del risultato del mio file.

Ecco un esempio di uno dei miei comandi sed:

sed -e "s/\"text\"/'text'/ig" file.xml > temp.tmp

È così che sfuggite alle virgolette in un comando sed o sto facendo qualcosa di sbagliato?


2
Il tuo comando sembra corretto per la sostituzione "text"con 'text'. Ovviamente non farà nulla per "othertext". Mostra alcune righe di input, l'output indesiderato corrispondente e spiega invece quale output desideri.
Gilles 'SO- smetti di essere cattivo'

Quindi \"è il modo corretto di sfuggire alle virgolette nel comando sed?
jbranchaud,

4
Non per sed: sed non ha bisogno, o supporto, di scappare ". Ma il tuo comando shell usa una stringa tra virgolette doppie ed \"è corretto lì. Il sedprogramma vede s/"text"/'text'/igcome argomento -e.
Gilles 'SO-smetti di essere malvagio' il

@Gilles Che dire degli spazi? Sed comprende e rispetta gli spazi bianchi? Ad esempio, se il mio comando contenesse Lo s/\"text\" /'text'/igtroverà solo "text" con lo spazio dopo di esso?
jbranchaud,

3
Gli spazi devono corrispondere esattamente. Piuttosto che continuare questo dialogo, ti consiglio di pubblicare alcuni input di esempio e l'output desiderato corrispondente (e forse spiegare perché è necessario modificare il preventivo). Non è nemmeno chiaro che sedsia lo strumento giusto per il lavoro, forse vuoi un parser XML.
Gilles 'SO-smetti di essere malvagio' il

Risposte:


11

Due consigli:

  1. Non puoi sfuggire a una singola virgoletta all'interno di una stringa tra virgolette singole. Quindi devi chiudere il preventivo, aggiungere un preventivo con escape, quindi aprire nuovamente i preventivi. Cioè 'foo'\''bar':, che si scompone come:

    • 'foo'        citato foo
    • \'             sfuggito '
    • 'bar'        citato bar

    cedendo foo'bar.

  2. (facoltativo) Non devi necessariamente usarlo /in sed. Trovo che l'uso /e \nella stessa espressione sed renda difficile la lettura.

Ad esempio, per rimuovere le virgolette da questo file:

$ cat /tmp/f
aaa"bbb"'ccc'aaa

Dati i miei due suggerimenti sopra, il comando che puoi usare per rimuovere le virgolette doppie e singole è:

$ sed -e 's|["'\'']||g'  /tmp/f

Sulla base del mio primo suggerimento, la shell riduce il secondo argomento di sed (cioè la stringa dopo la -e) a s|["']||ge passa quella stringa a sed. Sulla base del mio secondo consiglio, sed tratta questo come s/['"]//g. Significa

rimuovi tutti i caratteri corrispondenti a 'o "   (ovvero sostituiscili con nulla)

Probabilmente hai bisogno di qualcosa di più complesso di questo per fare quello che vuoi, ma è un inizio.


1
Per dare un punto più preciso al tuo secondo suggerimento: puoi usare qualsiasi carattere al posto di / quando usi i comandi se y, possibilmente tra gli altri. Quando si usano regexps con altri comandi sed, il primo delimitatore (se si usa un'alternativa a /) deve essere evitato. Il tuo delimitatore preferito deve essere salvato anche se stai cercando di abbinarlo all'interno di regexp.
Eli Heady,

È difficile mescolare virgolette singole e doppie senza diventare disordinati. Alcune persone trovano più facile leggere se si citano virgolette singole, inserendole tra virgolette doppie, anziché sfuggirle. Quindi, piuttosto che 'foo'\''bar', potremmo usare 'foo'"'"'bar'.
Scott,

1

Ho una porta Windows delle utility unix quindi i comandi sembrano un po 'diversi ma avevo un file CSV con virgole e virgolette. Usando questa discussione come guida, sono stato in grado di rimuovere le virgolette tramite questo comando:

c:\Temp> cat report.csv | sed "s/\,/\ /g" | sed "s/[""]//g"

Grazie! era bloccato su questo!
Sendbits
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.