Remover barras invertidas de um arquivo de texto


10

eu tenho

Entrada:

 NISHA =\455  

Resultado:

 NISHA = 455

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

character found after backslash is not meaningful

3
Você parece ter uma implementação não-POSIX sed(ou possivelmente está executando esse comando a partir de um shell não-POSIX?). Você não precisa sed, porém, tré suficiente: tr -d '\\' < P.
Stéphane Chazelas

Respostas:


20

Você pode substituir a barra invertida por um espaço, como mostra o 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 da barra invertida para cancelar seu significado especial. Barra invertida é um caractere especial usado para escapar em um shell e em expressões regulares.

O comando digitado na linha de comando ou no script do shell é processado pela primeira vez pelo shell, que interpreta o significado especial dos caracteres e seu escape. O resultado é 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, em seguida, adicione o escape para o shell.

  1. Em um regex (entrada para comandos como sed, grepetc.) barra invertida pode ser precedido de barra invertida assim: \\e você também pode usar a expressão de conjunto [\], como costumava, porque não barra invertida perde o seu significado especial.

  2. Em um shell (como bash), você pode escapar de barra invertida por barra invertida. Então, ao invés de \escrever \\. A inclusão da cadeia entre aspas duplas "torna o comportamento da barra invertida mais complicado <1>, mas a barra invertida dupla ainda produzirá uma única barra invertida. A inclusão da cadeia entre aspas simples 'faz com que todos os caracteres sejam tratados literalmente, exceto '.

Se você quiser usar aspas duplas , você pode usar uma das seguintes opções:
sed "s/\\\\//g"- Escape \por \no shell, e escapar cada \na regex novamente. De fato, as aspas duplas não são necessárias neste caso, porque todo caractere especial é escapado adequadamente.
sed "s/[\\]//g"- Escape no shell por uma barra invertida \e no 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 próprio, a menos que preceda um caractere especial no contexto de aspas duplas: $`"\ou uma nova linha. Parece que, no seu caso, o shell ou o sednão seguem o padrão POSIX.

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


6

Você tem que escapar da barra invertida. Tente o seguinte:

sed 's/\\//g'

3

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

$ 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

No awk, eu faria assim,

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

1
sed 's/\\//'

Coloque um \antes \como você faz com a maioria dos caracteres especiais.


Você omitiu a gbandeira por motivo desconhecido. Isso altera o comportamento do comando, mas essa alteração não foi solicitada na pergunta. Caso contrário, sua resposta não trará nada de novo em comparação com as respostas anteriores.
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.