Eliminar barras invertidas de un archivo de texto

10

yo tengo

Entrada:

 NISHA =\455  

Salida:

 NISHA = 455

Quiero eliminar \de la salida. Traté de usar el comando sed "s/[\]//g" Ppero no funciona y señala un error:

character found after backslash is not meaningful
yisha
fuente
3
Parece que tiene una implementación que no es POSIX sed(¿o posiblemente está ejecutando ese comando desde un shell que no es POSIX?). No es necesario sed, sin embargo, tres suficiente: tr -d '\\' < P.
Stéphane Chazelas

Respuestas:

20

Puede reemplazar la barra invertida por un espacio como se muestra en el resultado del ejemplo:

sed 's/\\/ /g'

o puede eliminarlo como se muestra en su código:

sed 's/\\//g'

Caracteres especiales

Hay posibles problemas con el escape de la barra invertida para cancelar su significado especial. La barra diagonal inversa es un carácter especial utilizado para escapar tanto en un shell como en expresiones regulares.

El comando que escribe en la línea de comando del shell o un script es procesado primero por el shell que interpreta el significado especial de los caracteres y su escape. El resultado luego se pasa al comando que se ejecutará (like sed) que realiza su propia interpretación de los caracteres. Cuando está construyendo un comando, el procedimiento mental es el opuesto: primero agregue el escape para la expresión regular y luego agregue el escape para el shell.

  1. En una expresión regular (entrada a comandos como sed, grepetc.), la barra invertida se puede escapar mediante una barra invertida como esta: \\y también puede usar la expresión de conjunto [\]como la usó porque la barra invertida pierde su significado especial.

  2. En un shell (como bash) puedes escapar de la barra invertida por la barra invertida. Entonces en lugar de \escribir \\. El encerrar la cadena entre comillas dobles "hace que el comportamiento de la barra invertida sea más complicado <1> pero la barra invertida doble aún producirá una barra invertida simple. El encerrar la cadena entre comillas simples 'hace que todos los caracteres sean tratados literalmente, excepto '.

Si desea utilizar comillas dobles , puede utilizar uno de los siguientes:
sed "s/\\\\//g"- Escapar \de \la cáscara, y escapar de todos \en la expresión regular de nuevo. De hecho, las comillas dobles no son necesarias en este caso porque cada carácter especial se escapa correctamente.
sed "s/[\\]//g"- Escápese en el caparazón mediante una barra diagonal inversa \y en la expresión regular use un conjunto [ ].
sed "s/[\]//g"- Sí, ¡su ejemplo debería funcionar en un entorno compatible con POSIX! Entre comillas dobles se \representa a menos que preceda un carácter especial en el contexto de comillas dobles: $`"\o una nueva línea. Parece que en su caso el shell o el sedno sigue el estándar POSIX.

Con comillas simples también puede usar la cadena como la usó o de una manera más corta:
sed 's/[\]//g'
sed 's/\\//g'

pabouk
fuente
6

Tienes que escapar de la barra invertida. Prueba esto:

sed 's/\\//g'
jherran
fuente
3

Si no desea soluciones sed, intente con los siguientes 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
αғsнιη
fuente
2

En awk, me gustaría hacer esto,

$ echo 'NISHA =\455' | awk '{gsub(/\\/," ")}1'
NISHA = 455
Avinash Raj
fuente
1
sed 's/\\//'

Coloca un \antes \como lo haces con la mayoría de los personajes especiales.

Nombre para mostrar
fuente
Has omitido la gbandera por razones desconocidas. Esto cambia el comportamiento del comando, pero dicho cambio no se solicitó en la pregunta. De lo contrario, su respuesta no trae nada nuevo en comparación con las respuestas anteriores.
pabouk