Perché sed non emette alcun testo?

1

Ho un file di testo di cui ho bisogno per rimuovere le doppie virgolette. Ho trovato questa domanda che suggeriva di utilizzare quanto segue:

sed 's/"//g' < infile > outfile

Capisco cosa sta facendo perché ho familiarità con Vim. Ma il file di output ha zero byte al suo interno dopo l'esecuzione del comando.

Ho provato l'altro suggerimento da quella domanda:

tr -d \" < infile > outfile

Questo genera un errore:

tr: Illegal byte sequence

Da notare che quando apro il file in MacVim e uso

:%s /"//g

funziona perfettamente.

C'è qualche differenza in sed di macOS? Qualche altro suggerimento su come posso farlo?

    
posta Chuck 26.03.2018 - 23:29
fonte

2 risposte

2

A quanto pare, il file è in formato UTF-16, ma la maggior parte degli strumenti di manipolazione del testo in macOS non sa come lavorarci e macchierà i file se ci provano. UTF-16 utilizza due byte per carattere; per caratteri ASCII semplici come " , è il codice ASCII a byte singolo seguito da un byte null. Qualcosa come tr -d \" cancellerà il primo byte, lasciando un byte nullo randagio e lanciando l'intero resto del file di un byte.

Penso che tu possa far funzionare perl in UTF-16 (vedi qui ), ma non sono sicuro dei dettagli. Questo potrebbe funzionare (basato su questo ):

perl -pe 'BEGIN { binmode $_, ":raw:encoding(UTF-16LE)" for *STDIN, *STDOUT }; s/"//g;' infile >outfile

Potresti anche convertirlo in UTF-8 e tornare con

iconv -f UTF-16LE -t UTF-8 infile | tr -d \" | iconv -f UTF-8 -t UTF-16LE >outfile

Se non è necessario che l'output sia in UTF-16, puoi lasciare l'ultimo iconv out.

    
risposta data 27.03.2018 - 03:12
fonte
1

Beh, non so esattamente perché questo problema stia accadendo, anche se ho trovato un po 'più di informazioni qui e here , nessuno dei due ha funzionato. Penso che sia la codifica e che LC_CTYPE=C potrebbe essere sulla strada giusta, ma ha convertito il testo in qualcosa di completamente diverso a causa di qualche tipo di problema di codifica.

Indipendentemente, l'ho risolto, almeno per ora, con questo:

vim -c '%s /"//g|wq' infile
    
risposta data 27.03.2018 - 00:10
fonte

Leggi altre domande sui tag