Sustitución de puntos (.) En sed

9

Entonces, la pregunta real es: ¿alguien tiene una idea de cómo eliminar M-BM-caracteres especiales sin correr el riesgo de perder otros caracteres?

Tengo una cadena de texto:

" . . ."

es decir

space dot space dot space dot

Estoy tratando de reemplazar toda la aparición de esta cadena en el archivo de texto para

"..."

es decir

dot dot dot

Estaba tratando de hacer con sed:

sed -r 's:\s\.\s\.\s\.:...:g' -i sed-dots

Desafortunadamente, no cambia el archivo de entrada ni un poco. Archivo: https://www.dropbox.com/s/46zmiruy3ln85a1/sed-dots

Cuando trato de reemplazar la misma cadena en el editor de texto (uso geany), se encuentra y se reemplaza correctamente.

La única razón por la que puedo pensar es que algunos (o todos) de esos espacios no son realmente espacios, sino algún carácter especial.

¿Alguien tiene idea de cómo encontrar y reemplazar esa cadena con sed (o cualquier otra herramienta de línea de comando)? Por favor, pruebe su idea en mi archivo, ya que el problema no es tan obvio como parece, por eso le pregunté al respecto.

Después de usar cat -Amyfile, parece problemático que esos espacios no sean espacios, sino M-BM-caracteres especiales. El uso de cualquier símbolo .sugerido para la búsqueda no es una buena idea ya que existe el riesgo de que se eliminen otros caracteres.

Rafal
fuente

Respuestas:

9

Primero, comenzaría probando echoy canalizando eso sed, que usando un archivo real. En segundo lugar, puede usar a {n}en el modelo extendido de expresiones regulares para denotar múltiplos y límites.

Estabas prácticamente allí, pero tu expresión regular esperaba un espacio de liderazgo.

$ echo 'cheese . . . muffins' | sed -r 's/(\s?\.){3}/ dot dot dot/g'
cheese dot dot dot muffins

Tenga en \s?cuenta que todavía es lo suficientemente codicioso como para arruinar la salida, por lo que he agregado un espacio a la salida. Puede que no quieras eso. También hice que el espacio sea opcional, por lo que coincidirá con todo lo siguiente:

...
. ..
.. .
. . .
 . . . 

Simplemente quite la ?bandera opcional .


Dado su problema con Unicode (en los comentarios), puede forzar los datos a su equivalencia ASCII con iconvy luego depositarlos:

$ iconv -f utf-8 -t ascii//translit sed-dots | sed -r 's/(\s?\.){3}/ dot dot dot/g'
Lorem ipsum dot dot dot
Some dot dot dot more text
Oli
fuente
Me sorprende que recomiende usar en echolugar de capturar un archivo, al menos cuando captura un archivo, sabe que el shell no está interpretando nada, y tampoco lo es echo.
Flimm
@Flimm para un ejemplo simple con puntos, esto no es realmente un problema. Si va a cargar desde un archivo, no se preocupe cat, solo sedcargue el archivo (según el ejemplo del OP) pero no guarde en línea (eliminar -i, para que pueda ver y probar en contra de la salida).
Oli
@Oli Funciona con su ejemplo, pero no funciona con mi archivo (en mi pregunta, hay un enlace). Ese es un problema: su comando y otros deberían funcionar, pero no funcionan, ya que hay algún problema con esos puntos. Pruebe su comando en mi archivo y verá que no funciona.
Rafal
1
@Rafal Si observas cat -A sed-dots, puedes ver que los "espacios" entre los puntos son M-BM- caracteres especiales ... No estoy seguro de cómo se arrastraron allí, pero necesitan ser reemplazados. Si no puedes apuntarles bien, esto funciona: sed -r 's/(\s\..\..\.)/ dot dot dot/ig' sed-dots
Oli
@Oli funciona. ¡Muchas gracias! ¿Podría explicar la sintaxis? ¿Estás seguro de que no tiene ningún efecto secundario y no reemplazará nada más? Por lo que veo, este RegExp coincidirá con cualquier personaje después de los puntos. Sin embargo, M-BM no es un personaje, son tres. Entonces, ¿cómo puede funcionar?
Rafal
0

Pruebe lo siguiente para reemplazar todos los "." A "."

sed -r 's/\. /\./g' -i sed-dots

Pero para ". . ." a "..."

sed -r 's/\. \. \./\.\.\./g' -i sed-dots
Meer Borg
fuente
0

Podría usar su archivo cuando lo revisé:

tr '\240' ' ' < sed-dots.txt > sed-dots.new

Esto funcionó sin un paso de conversión:

sed 's/[[:blank:]]\.[[:blank:]]\.[[:blank:]]\./.../g' sed-dots.txt
Escrutador
fuente
No funciona. Supongo que esa razón es el extraño personaje de M-BM que @Oli ha encontrado.
Rafal