He estado usando sed
durante bastante tiempo, pero aquí hay una peculiaridad que encontré, que no puedo resolver.
Déjame explicarte mi problema con el caso real.
Escena 1
printf "ls" | xclip -selection clipboard
echo "ls" | xclip -selection clipboard
En el primer comando, canalizo la printf
salida a xclip
para que se copie en el portapapeles. Ahora, a printf
diferencia echo
, no inserta una nueva línea al final de forma predeterminada. Entonces, si pego este contenido en la terminal, el ls
comando que se copia no se ejecuta automáticamente.
En el segundo, hay una nueva línea al final, por lo que al pegar el contenido del portapapeles también se ejecuta el comando en el portapapeles.
Esto no es deseable para mí. Entonces, quería eliminar la nueva línea usando sed
, pero falló, como se explica en la escena a continuación.
Escena # 2
echo "ls" | sed -r 's/\n//g' | xclip -selection clipboard
El contenido en el portapapeles todavía contiene nueva línea. Cuando lo pego en la terminal, el comando se ejecuta automáticamente.
También intenté eliminar el carácter de retorno de carro \r
. Pero nada Parece que me estoy perdiendo algo muy crucial / básico aquí.
generate-text | xclip
caso. Esta respuesta solo elimina la última línea nueva.Muchas herramientas de procesamiento de texto, incluido sed, operan en el contenido de la línea, excluyendo el carácter de nueva línea. Lo primero que hace sed al procesar una línea es quitar la nueva línea al final, luego ejecuta los comandos en el script y agrega una nueva línea final al imprimir. Por lo tanto, no podrá eliminar la nueva línea con sed.
Para eliminar todas las nuevas líneas, puede usar
tr
en su lugar:fuente
Puede reemplazar las nuevas líneas en sed pasándole la opción -z .
Página del manual de Sed:
fuente
| xclip
caso.Si solo está poniendo comandos en el portapapeles
Si además necesita realizar transformaciones más complejas,
fuente
perl
ypython
son mucho más lentos de lo quesed
pueden ser cuando se usan correctamente. Sin embargo, aprender a usarlo correctamente es la clave.sed
puede hacer mucho más que manejar solo sus frases ingeniosas , y probablemente puede hacerlo más rápido que cualquiera de esas otras herramientas que menciona.Para eliminar solo la última línea nueva , pase por:
sed
no agregará a\0
al final de la secuencia si el delimitador se establece enNUL
via-z
, mientras que para crear un archivo de texto POSIX (definido para terminar en a\n
), siempre generará un final\n
sin-z
.P.ej:
Y para probar no
NUL
añadido:Para eliminar varias líneas nuevas finales , canalice a través de:
fuente