Rimuovere le barre rovesciate da un file di testo


10

io ho

Ingresso:

 NISHA =\455  

Produzione:

 NISHA = 455

Voglio rimuovere \dall'output. Ho provato a usare il comando sed "s/[\]//g" Pma non funziona e segnala un errore:

character found after backslash is not meaningful

3
Sembra che tu abbia un'implementazione non POSIX di sed(o forse stai eseguendo quel comando da una shell non POSIX?). Non è necessario sed, però, trè sufficiente: tr -d '\\' < P.
Stéphane Chazelas,

Risposte:


20

Puoi sostituire la barra rovesciata con uno spazio come mostrato nel risultato dell'esempio:

sed 's/\\/ /g'

oppure puoi rimuoverlo come indicato nel codice:

sed 's/\\//g'

Personaggi speciali

Ci sono possibili problemi con l'escaping di backslash per annullarne il significato speciale. La barra rovesciata è un carattere speciale utilizzato per la fuga sia in una shell che in espressioni regolari.

Il comando digitato sulla riga di comando della shell o su uno script viene prima elaborato dalla shell che interpreta il significato speciale dei caratteri e la loro fuga. Il risultato viene quindi passato al comando da eseguire (come sed) che esegue la propria interpretazione dei personaggi. Quando stai costruendo un comando, la procedura mentale è l'opposto: prima aggiungi la fuga per la regex, quindi aggiungi la fuga per la shell.

  1. In una regex (input per comandi come sed, grepecc.) La barra rovesciata può essere sfuggita da una barra rovesciata in questo modo: \\e puoi anche usare l'espressione impostata [\]come hai usato perché la barra rovesciata perde il suo significato speciale.

  2. In una shell (come bash) puoi sfuggire alla barra rovesciata. Quindi invece di \scrivere \\. Racchiudere la stringa tra virgolette doppie "rende il comportamento della barra rovesciata più complicato <1>, ma la barra rovesciata doppia produrrà comunque una barra rovesciata singola. Racchiudere la stringa tra virgolette singole 'rende ogni carattere da trattare letteralmente tranne '.

Se vuoi usare le virgolette doppie , puoi usare una delle seguenti
sed "s/\\\\//g"opzioni : - Scappa \dalla \shell e scappa di nuovo da ogni \regex. In questo caso, in questo caso, non sono necessarie le doppie virgolette perché ogni carattere speciale è correttamente evaso.
sed "s/[\\]//g"- Fuga nella shell da una barra rovesciata \e nella regex usa un set [ ].
sed "s/[\]//g"- Sì, il tuo esempio dovrebbe funzionare in un ambiente conforme a POSIX! Tra virgolette doppie si \rappresenta se non precede un carattere speciale nel contesto di virgolette doppie: $`"\o una nuova riga. Sembra che nel tuo caso o la shell o il sednon segua lo standard POSIX.

Con le virgolette singole puoi anche usare la stringa come hai usato o in modo più breve:
sed 's/[\]//g'
sed 's/\\//g'


6

Devi sfuggire alla barra rovesciata. Prova questo:

sed 's/\\//g'

3

Se non vuoi soluzioni sed, prova con i seguenti comandi:

$ echo "NISHA =\455"| awk -F'\' '{print $1 $2}'
$ echo "NISHA =\455"| tr '\\' ' '
$ echo "NISHA =\455"| tr -d '\\'
$ echo "NISHA =\455"| cut -c 1-7,9-11

2

In awk, farei così,

$ echo 'NISHA =\455' | awk '{gsub(/\\/," ")}1'
NISHA = 455

1
sed 's/\\//'

Metti un \prima \come fai con i personaggi più speciali.


Hai omesso la gbandiera per motivi sconosciuti. Ciò modifica il comportamento del comando ma tale modifica non è stata richiesta nella domanda. Altrimenti la tua risposta non porta nulla di nuovo rispetto alle risposte precedenti.
pabouk,
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.