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.
prefixcontendrá /. Es un camino, /opt/workdir/por ejemplo.
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.
prefixcontendrá /. Es un camino, /opt/workdir/por ejemplo.
Respuestas:
# 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 prefixcontiene /, puede usar cualquier otro personaje que no esté en él prefixo escapar de él /, por lo que el sedcomando se convierte en
's#^#/opt/workdir#'
# or
's/^/\/opt\/workdir/'
seden una tubería, por ejemplo foo | 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/' filesi desea agregar una cadena al final de cada línea.
awk '$0="prefix"$0' file > new_file
Con Perl (reemplazo en el lugar):
perl -pi 's/^/prefix/' file
prtinf "$VARIABLE\n" | awk '$0="prefix"$0'
awkinformes awk: out of memory in readrec 1 source line number 1, pero la solución se sedcompleta con éxito.
Puede usar Vim en modo Ex:
ex -sc '%s/^/prefix/|x' file
% seleccione todas las líneas
s reemplazar
x guardar y cerrar
:%s/^/prefix/, ya que esta estrategia termina siendo útil en muchas situaciones
Si tienes Perl:
perl -pe 's/^/PREFIX/' input.file
Usando la cáscara:
#!/bin/bash
prefix="something"
file="file"
while read -r line
do
echo "${prefix}$line"
done <$file > newfile
mv newfile $file
Aquí hay una solución oneliner altamente legible que usa el tscomando de moreutils
$ cat file | ts prefix | tr -d ' '
Y cómo se deriva paso a paso:
# Step 0. create the file
$ cat file
line1
line2
line3
# Step 1. add prefix to the beginning of each line
$ cat file | ts prefix
prefix line1
prefix line2
prefix line3
# Step 2. remove spaces in the middle
$ cat file | ts prefix | tr -d ' '
prefixline1
prefixline2
prefixline3
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 -sopción de nlera intrigante, y las pruebas demostraron que no introdujo el almacenamiento en búfer no deseado que me preocupaba.
Sin nlembargo, 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 -scadena con un retorno de carro (CR o ^ M o Ctrl-M). Así por ejemplo:
#!/bin/ksh
# Monitor the widget, framas, and dweezil
# log files until the operator hits <enter>
# to end monitoring.
PGRP=$$
for LOGFILE in widget framas dweezil
do
(
tail -f $LOGFILE 2>&1 |
nl -s"^M${LOGFILE}> "
) &
sleep 1
done
read KILLEM
kill -- -${PGRP}
-uopción de sed para evitar el almacenamiento en búfer.
Usando ed:
ed infile <<'EOE'
,s/^/prefix/
wq
EOE
Esto sustituye, para cada línea ( ,), el comienzo de la línea ( ^) con prefix. wqsalva y sale.
Si la cadena de reemplazo contiene una barra oblicua, podemos usar un delimitador diferente para s:
ed infile <<'EOE'
,s#^#/opt/workdir/#
wq
EOE
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.
También puede lograr esto utilizando la técnica de referencia
sed -i.bak 's/\(.*\)/prefix\1/' foo.txt
También puedes usar con awk como este
awk '{print "prefix"$0}' foo.txt > tmp && mv tmp foo.txt
Aquí hay un ejemplo resumido usando el sedenfoque de esta respuesta :
$ cat /path/to/some/file | prefix_lines "WOW: "
WOW: some text
WOW: another line
WOW: more text
function show_help()
{
IT=$(CAT <<EOF
Usage: PREFIX {FILE}
e.g.
cat /path/to/file | prefix_lines "WOW: "
WOW: some text
WOW: another line
WOW: more text
)
echo "$IT"
exit
}
# Require a prefix
if [ -z "$1" ]
then
show_help
fi
# Check if input is from stdin or a file
FILE=$2
if [ -z "$2" ]
then
# If no stdin exists
if [ -t 0 ]; then
show_help
fi
FILE=/dev/stdin
fi
# Now prefix the output
PREFIX=$1
sed -e "s/^/$PREFIX/" $FILE
PREFIXcontiene 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 fileHará 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).
sedtareas livianas como esta. Si se conoce el "prefijo", es muy fácil elegir un personaje que no sea del "prefijo".