Tuberías de comandos, modificar stdin escribir en stdout

8
echo Hello World | nano - | less

Quiero modificar Hola -> Adiós mientras estoy en el editor de texto.

No tiene que ser con nano. Estoy atascado con la lectura estándar de nano pero requiero que escriba en un archivo (escribir en - crea un archivo llamado -)

usuario65660
fuente
@slm, creo que tiene más sentido cerrar la otra Q como un engaño de esto, ya que este es el caso más amplio.
Graeme
@Graeme: tendería a estar de acuerdo contigo, pero el otro también tiene tu respuesta, aunque no tan bien escrito. Algunas fusiones podrían ser más adecuadas. ¿Quizás deberíamos contar con la ayuda de un mod para ayudar con estos 2? Haré un ping sobre eso.
slm
@slm, creo que podemos dejarlo a quien esté pasando por la cola cerrada y dejar que la multitud decida. La principal diferencia, según lo veo, es que la otra Q es un caso especial de esto en el que solo desea un extremo de la tubería.
Graeme
1
@Graeme: si no cebamos la bomba, entonces ppl probablemente cerrará el más nuevo al más antiguo como un dup.
slm

Respuestas:

11

El paquete moreutils tiene un gran comando para hacer esto, llamado vipe. Desde la página del manual:

SYNOPSIS
       command1 | vipe | command2

DESCRIPTION
       vipe allows you to run your editor in the middle of a unix pipeline and
       edit the data that is being piped between programs. Your editor will have
       the full data being piped from command1 loaded into it, and when you close
       it, that data will be piped into command2.

De forma predeterminada, esto usará el editorcomando, que generalmente es solo un enlace simbólico al editor de línea de comando predeterminado. Puede cambiar esto alterando el enlace (uso update-alternativesen sistemas basados ​​en Debian) o usando la EDITORvariable de entorno. Por ejemplo, podrías hacer:

echo Hello World | EDITOR=nano vipe | less

De lo contrario, si el editor de texto en particular no tiene soporte para este tipo de cosas, creo que está atrapado en la creación manual de un archivo temporal, escribir el archivo en eso, ejecutar el editor, ingresar el archivo al resto de la tubería y eliminando el archivo temporal. El vipecomando básicamente se encarga de todo esto. Esto es bueno, pero el comando rara vez está disponible por defecto.

Graeme
fuente
1

El editor de texto Joe (también conocido como Joe's Own Editor ) hace lo que quieres.

El comando echo "hello world" | joe - | lessfunciona como se esperaba, aunque necesita las comillas por alguna razón.

Algunos comandos (como gpg) producen una salida mostrada que no ingresa a la tubería. Esto corrompe la pantalla inicial dentro de Joe, pero presionar ctrl + r - actualizar - limpiará las cosas.

Ben Tesch
fuente
1

Si todo lo que desea es reemplazar "Hola" con "Adiós" (o cualquier otro reemplazo de palabras), puede evitar la edición manual en un editor a favor de la herramienta de búsqueda y reemplazo automático. Por ejemplo, "sed" puede hacer reemplazos como este:

echo Hello World | sed 's/Hello/Goodbye/' | less

Verifique "man sed" para más detalles.

ElazarR
fuente