Pregunta

¿Hay alguna manera de ejecutar un reemplazo de cadena de expresiones regulares en la línea actual en bash?

Me encuentro con bastante frecuencia en la situación en la que escribí una línea de comando larga y luego me doy cuenta de que me gustaría cambiar una palabra en algún lugar de la línea.

Mi enfoque actual es terminar la línea, presionar Control+A (para llegar al inicio de la línea), inserte un # (para comentar la línea), presione Intro y luego use el ^oldword^newword sintaxis (^oldword^newword ejecuta el comando anterior después de sustituir palabra antigua por palabra nueva).

Pero tiene que haber una manera mejor (más rápida) de lograrlo.(El mouse no es posible, ya que estoy en sesiones ssh la mayor parte del tiempo).

Probablemente haya algún comando clave similar a emacs para esto, que no conozco.

Editar:Intenté usar el modo vi.Algo extraño ocurrió.Aunque soy un usuario cariñoso de vim, tuve serios problemas para usar mi querido bash.Todos esos movimientos de los dedos que se han quedado grabados en mi subconsciente de repente dejaron de funcionar.Rápidamente regresé al modo emacs y lo consideré, probando emacs como mi editor favorito (aunque supongo que podría volver a suceder lo mismo).

¿Fue útil?

Solución

Desafortunadamente, no, no existe realmente una mejor manera.Si simplemente está cansado de presionar las teclas, puede usar macros para recortarlas.Añade lo siguiente a tu ~/.inputrc:

"\C-x6": "\C-a#\C-m^"
"\C-x7": "\C-m\C-P\C-a\C-d\C-m"

Ahora, en una nueva instancia de bash (o después de recargar .inputrc en su shell actual presionando C-x C-r), puedes hacer lo siguiente:

  1. Escriba un comando falso (por ejemplo, ls abcxyz).
  2. Presione Ctrl-x, luego 6.La macro inserta un # al principio de la línea, ejecuta la línea comentada y escribe su primer ^.
  3. Escriba su corrección (por ejemplo, xyz^def).
  4. Presione Ctrl-x, luego 7.La macro completa su sustitución, luego sube a la línea anterior (comentada), elimina el carácter de comentario y lo ejecuta nuevamente.

No es exactamente elegante, pero creo que es lo mejor que obtendrás con readline.

Otros consejos

en ksh, en modo vi, si presiona 'v' mientras está en modo comando, generará una sesión vi completa en el contenido de su línea de comando actual.Luego puede editar usando toda la gama de comandos vi (búsqueda global y reemplazo en su caso).Cuando :wq de vi, se ejecuta el comando editado.Estoy seguro de que existe algo similar para bash.Dado que bash tiende a extender sus predecesores, probablemente haya algo similar.

Buen día,

¿Qué tal si usamos el modo vi en su lugar?Simplemente ingresa set -o vi

Luego, puedes ir a la palabra que deseas cambiar y simplemente hacer cw o cW dependiendo de lo que contenga la palabra.

Vaya, olvidé agregar, ingrese ESC k a o en la línea anterior en el historial de comandos.

¿Qué usas normalmente como editor?

Saludos, Rob

Editar:Lo que olvidé decir en mi respuesta original fue que debes pensar en la línea de comando vi en bash usando los comandos que ingresas cuando estás en modo "ex" en vi, es decir.después de haber ingresado a los dos puntos.

Lo peor es que necesitas moverte por tu historial de comandos usando los antiguos comandos vi de h (a la izquierda) y l (a la derecha).Sin embargo, puedes usar w (o W) para rebotar entre palabras.

Sin embargo, una vez que te acostumbras, tienes todo tipo de comandos disponibles, p.Al ingresar ESC / my_command se revisará su historial, primero el más reciente, para encontrar la primera aparición de la línea de comando que contiene el texto my_command.Una vez que haya encontrado eso, puede usar n para encontrar la siguiente aparición, etc.Y N para invertir la dirección de la búsqueda.

Iría a leer la página de manual de bash para ver qué hay disponible en el modo vi.Una vez que superes el hecho de que las flechas hacia arriba y hacia abajo son reemplazadas por ESC k y luego j, verás que el modo vi ofrece más que el modo emacs para la edición de la línea de comandos en bash.

En mi humilde opinión, ¡naturalmente!(-:

¿Emacs?¡Ochenta megas e intercambiando constantemente!

Saludos, Rob

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top