Tengo un archivo de la siguiente manera:
line1
line2
line3
Y quiero obtener:
prefixline1
prefixline2
prefixline3
Podría escribir un script Ruby, pero es mejor si no lo necesito.
prefix
contendrá /
. Es un camino, /opt/workdir/
por ejemplo.
linux
scripting
text-processing
pierrotlefou
fuente
fuente
sed
tareas livianas como esta. Si se conoce el "prefijo", es muy fácil elegir un personaje que no sea del "prefijo".sed
en una tubería, por ejemplofoo | sed -e 's/^/x /' | bar
.sed -e '2,$s/^/prefix/'
./
gusta\/
(en cadenas de comillas simples) o\\/
(en cadenas de comillas dobles)sed -e 's/$/postfix/' file
si desea agregar una cadena al final de cada línea.Con Perl (reemplazo en el lugar):
fuente
prtinf "$VARIABLE\n" | awk '$0="prefix"$0'
awk
informesawk: out of memory in readrec 1 source line number 1
, pero la solución sesed
completa con éxito.Puede usar Vim en modo Ex:
%
seleccione todas las líneass
reemplazarx
guardar y cerrarfuente
:%s/^/prefix/
, ya que esta estrategia termina siendo útil en muchas situacionesSi su prefijo es un poco complicado, simplemente póngalo en una variable:
Luego, pasa esa variable y deja que awk se ocupe de ella:
fuente
Si tienes Perl:
fuente
Usando la cáscara:
fuente
Aquí hay una solución oneliner altamente legible que usa el
ts
comando de moreutilsY cómo se deriva paso a paso:
fuente
Si bien 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 alertas simultáneamente, con el prefijo de cada línea con el nombre de su registro respectivo .
Desafortunadamente, sed, cut, etc. introdujo demasiado buffering y me impidió ver las líneas más actuales. La sugerencia de Steven Penny de usar la
-s
opción denl
era intrigante, y las pruebas demostraron que no introdujo el almacenamiento en búfer no deseado que me preocupaba.Sin
nl
embargo, hubo un par de problemas con el uso , 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 deseable usar las columnas adicionales). Primero, usar "cortar" para eliminar los números reintroduce el problema de almacenamiento en búfer, por lo que arruina la solución. En segundo lugar, el uso de "-w1" no ayuda, ya que esto NO restringe el número de línea a una sola columna, simplemente se amplía a medida que se necesitan más dígitos.No es bonito si quieres capturar esto en otro lugar, pero dado que eso es exactamente lo que no necesitaba hacer (ya se estaba escribiendo todo en los archivos de registro, solo quería ver varios a la vez en tiempo real), lo mejor La forma de perder los números de línea y tener solo mi prefijo era comenzar la
-s
cadena con un retorno de carro (CR o ^ M o Ctrl-M). Así por ejemplo:fuente
-u
opción de sed para evitar el almacenamiento en búfer.Usando ed:
Esto sustituye, para cada línea (
,
), el comienzo de la línea (^
) conprefix
.wq
salva y sale.Si la cadena de reemplazo contiene una barra oblicua, podemos usar un delimitador diferente para
s
:He citado el delimitador here-doc
EOE
("fin de ed") para evitar la expansión de parámetros. En este ejemplo, también funcionaría sin comillas, pero es una buena práctica evitar sorpresas si alguna vez tiene un$
script ed.fuente
Usando & (toda la parte de la entrada que coincidió con el patrón ”):
O usando referencias posteriores:
fuente
También puede lograr esto utilizando la técnica de referencia
También puedes usar con awk como este
fuente
Aquí hay un ejemplo resumido usando el
sed
enfoque de esta respuesta :prefix_lines
fuente
PREFIX
contiene caracteres especiales para sed como una barra inclinada.prefix_lines \*
Para las personas con sistemas BSD / OSX hay una utilidad llamada
lam
, abreviatura de laminado.lam -s prefix file
Hará lo que quieras. Lo uso en tuberías, por ejemplo:find -type f -exec lam -s "{}: " "{}" \; | fzf
... que encontrará todos los archivos, exec lam en cada uno de ellos, dando a cada archivo un prefijo de su propio nombre de archivo. (Y bombee la salida a fzf para buscar).
fuente