Agregue una cadena de prefijo al comienzo de cada línea

Tengo un archivo como a continuación:

line1 line2 line3 

Y quiero obtener:

 prefixline1 prefixline2 prefixline3 

Podría escribir un guión de Ruby, pero es mejor si no es necesario.

prefix contendrá / . Es una ruta, /opt/workdir/ por ejemplo.

 sed -e 's/^/prefix/' file # If you want to edit the file in-place sed -i -e 's/^/prefix/' file # If you want to create a new file sed -e 's/^/prefix/' file > file.new 

Si el prefix contiene / , puede usar cualquier otro carácter que no esté en el prefix , o escape el / , para que el comando sed convierta en

 's#^#/opt/workdir#' # or 's/^/\/opt\/workdir/' 
 awk '$0="prefix"$0' file > new_file 

Puedes usar Vim en modo Ex:

 ex -sc '%s/^/prefix/|x' file 
  1. % seleccione todas las líneas

  2. s reemplazar

  3. x guardar y cerrar

Si tu prefijo es un poco complicado, simplemente ponlo en una variable:

 prefix=path/to/file/ 

Entonces, pasas esa variable y dejas que se ocupe de ella:

 awk -v prefix="$prefix" '{print prefix $0}' input_file.txt 

Si tienes Perl:

 perl -pe 's/^/PREFIX/' input.file 

Usando el caparazón:

 #!/bin/bash prefix="something" file="file" while read -r line do echo "${prefix}$line" done <$file > newfile mv newfile $file 

Aunque no creo que pierr tuviera esta preocupación, necesitaba una solución que no retrasara la salida de la “cola” en vivo de un archivo, ya que quería monitorear varios registros de alerta simultáneamente, prefijando cada línea con el nombre de su registro respectivo .

Desafortunadamente, sed, corte, etc. introdujo demasiado buffering y me impidió ver las líneas más actuales. La sugerencia de Steven Penny de usar la opción -s de nl fue intrigante, y las pruebas probaron que no introdujo el buffering no deseado que me preocupaba.

Hubo un par de problemas con el uso de nl , sin embargo, relacionados con el deseo de eliminar los números de línea no deseados (incluso si no le importa la estética de la misma, puede haber casos en los que no sería conveniente utilizar las columnas adicionales) . Primero, usar “cortar” para quitar los números vuelve a introducir el problema del almacenamiento en búfer, por lo que arruina la solución. En segundo lugar, usar “-w1” no ayuda, ya que esto NO restringe el número de línea a una sola columna, simplemente se hace más ancho a medida que se necesitan más dígitos.

No es lindo si quieres capturar esto en otro lugar, pero como eso es exactamente lo que no tenía que hacer (todo estaba siendo escrito para registrar archivos, solo quería ver varios a la vez en tiempo real), el mejor forma de perder los números de línea y tener solo mi prefijo era para iniciar la cadena -s con un retorno de carro (CR o ^ M o Ctrl-M). Así por ejemplo:

 #!/bin/ksh # Monitor the widget, ftwigs, and dweezil # log files until the operator hits  # to end monitoring. PGRP=$$ for LOGFILE in widget ftwigs dweezil do ( tail -f $LOGFILE 2>&1 | nl -s"^M${LOGFILE}> " ) & sleep 1 done read KILLEM kill -- -${PGRP} 

Usando ed:

 ed infile <<'EOE' ,s/^/prefix/ wq EOE 

Esto sustituye, para cada línea ( , ), el comienzo de la línea ( ^ ) con prefix . wq guarda y sale.

Si la cadena de reemplazo contiene una barra inclinada, podemos usar un delimitador diferente para s en s lugar:

 ed infile <<'EOE' ,s#^#/opt/workdir/# wq EOE 

He citado el delimitador de aquí-documento EOE ("end of ed") para evitar la expansión de parámetros. En este ejemplo, funcionaría sin comillas también, pero es una buena práctica evitar sorpresas si alguna vez tiene $ en su script ed.

Aquí hay un ejemplo envuelto usando el enfoque sed de esta respuesta :

 $ cat /path/to/some/file | prefix_lines "WOW: " WOW: some text WOW: another line WOW: more text 

prefix_lines

 function show_help() { IT=$(CAT <