Remover barras invertidas de um arquivo de texto

8

Eu tenho

Entrada:

 NISHA =5  

Saída:

 NISHA = 455

Eu quero remover \ da saída. Eu tentei usar o comando sed "s/[\]//g" P , mas ele não está funcionando e sinaliza um erro:

character found after backslash is not meaningful
    
por yisha 21.11.2014 / 11:13

5 respostas

16

Você pode substituir a barra invertida por um espaço, conforme mostrado no resultado do exemplo:

sed 's/\/ /g'

ou você pode removê-lo como mostra no seu código:

sed 's/\//g'

Caracteres especiais

Existem possíveis problemas com o escape de barras invertidas para cancelar seu significado especial. Barra invertida é um caractere especial usado para escapar tanto em um shell quanto em expressões regulares.

O comando que você digita na linha de comando do shell ou em um script é primeiro processado pelo shell, que interpreta o significado especial dos caracteres e seu escape. O resultado é então passado para o comando a ser executado (como sed ), que executa sua própria interpretação dos caracteres. Quando você está construindo um comando, o procedimento mental é o oposto: primeiro adicione o escape para o regex e adicione o escape para o shell.

  1. Em um regex (a entrada para comandos como sed , grep etc.) pode ser escapada por barra invertida assim: \ e você também pode usar o conjunto expressão [\] como você usou porque a contrabarra perde seu significado especial.

  2. Em um shell (como bash ), você pode escapar de barra invertida por barra invertida. Então, em vez de \ , escreva \ . Colocar a string entre aspas duplas " torna o comportamento de barra invertida mais complicado < 1 > / sup> , mas a contrabarra dupla ainda produzirá uma única barra invertida. Colocar a string entre aspas simples ' faz com que cada caractere seja tratado literalmente, exceto ' .

Se você quiser usar aspas duplas , poderá usar uma das seguintes opções:% sed "s/\\//g" - Escape \ by \ no shell e escape a cada \ na regex novamente. Na verdade, as aspas duplas não são necessárias nesse caso, porque todo caractere especial é apropriadamente evitado.
sed "s/[\]//g" - Escape no shell por uma barra invertida \ e na regex use um conjunto [ ] .
sed "s/[\]//g" - Sim, seu exemplo deve funcionar em um ambiente compatível com POSIX! Entre aspas duplas \ representa a si mesmo, a menos que preceda um caractere especial no contexto de aspas duplas: $'"\ ou newline. Parece que no seu caso o shell ou o sed não seguem o padrão POSIX.

Com aspas simples , você também pode usar a string como usou ou de maneira mais curta:
sed 's/[\]//g' e sed 's/\//g'

    
por 21.11.2014 / 11:18
5

Você tem que escapar da barra invertida. Tente isto:

sed 's/\//g'
    
por 21.11.2014 / 11:18
3

Se você não quiser soluções sed, tente os seguintes comandos:

$ echo "NISHA =5"| awk -F'\' '{print $1 $2}'
$ echo "NISHA =5"| tr '\' ' '
$ echo "NISHA =5"| tr -d '\'
$ echo "NISHA =5"| cut -c 1-7,9-11
    
por 21.11.2014 / 13:08
1
sed 's/\//'

Coloque um \ antes de \ , como faz com a maioria dos caracteres especiais.

    
por 21.11.2014 / 13:05
1

No awk, eu faria assim,

$ echo 'NISHA =5' | awk '{gsub(/\/," ")}1'
NISHA = 455
    
por 21.11.2014 / 13:08