Tengo un archivo de script que necesito modificar con otro script para insertar un texto en la octava línea.
Cadena para insertar:, Project_Name=sowstest
en un archivo llamado start
.
Traté de usar awk y sed, pero mi comando se está confundiendo.
sed -i '8i8 This is Line 8' FILE
insertos en la línea 8
8 This is Line 8
en el archivo ARCHIVO
-i
realiza la modificación directamente al archivo ARCHIVO, sin salida a stdout, como se menciona en los comentarios de Glenn Jackman.
brew install gnu-sed
y luego usen esto congsed
sed '8i\ 8 This is Line 8' FILE
.Una
ed
respuesta.
en su propia línea termina el modo de entrada;w
escribeq
en paz. GNU ed tiene unwq
comando para guardar y salir, pero los ed viejos no.Lectura adicional: https://gnu.org/software/ed/manual/ed_manual.html
fuente
OS X / macOS / FreeBSD
sed
La
-i
bandera funciona de manera diferente en macOSsed
que en GNUsed
.Aquí está la forma de usarlo en macOS / OS X:
Ver
man 1 sed
para más información.fuente
la respuesta awk
fuente
#define SERVER@"http://10.35.42.54/ms0.8"
a una línea en particular. ¿Cómo puedo conseguir esto?>
es el símbolo de redirección de shell para que la salida de awk se almacene en el archivo llamado "file.new".POSIX
sed
(y, por ejemplo, OS Xsed
, lossed
siguientes)i
deben ir seguidos de una barra diagonal inversa y una nueva línea. Además, al menos OS Xsed
no incluye una nueva línea después del texto insertado:Para reemplazar una línea, puede usar los comandos
c
(cambiar) os
(sustituir) con una dirección numérica:Alternativas usando
awk
:awk
interpreta las barras diagonales inversas en las variables pasadas con,-v
pero no en las variables pasadas usandoENVIRON
:Ambos
ENVIRON
y-v
están definidos por POSIX.fuente
Soluciones Perl:
rápido y sucio:
perl -lpe 'print "Project_Name=sowstest" if $. == 8' file
-l
elimina las nuevas líneas y las agrega nuevamente, eliminando la necesidad de "\ n"-p
recorre el archivo de entrada, imprimiendo cada línea-e
ejecuta el código entre comillas simples$.
es el número de líneaequivalente a la solución awk de @ glenn, utilizando argumentos con nombre:
perl -slpe 'print $s if $. == $n' -- -n=8 -s="Project_Name=sowstest" file
-s
permite un analizador de argumentos rudimentario--
evita que -n y -s sean analizados por el analizador de argumentos perl estándarargumentos de comando posicional:
perl -lpe 'BEGIN{$n=shift; $s=shift}; print $s if $. == $n' 8 "Project_Name=sowstest" file
Variables de entorno:
ENV
es el hash que contiene todas las variables de entornoGetopt para analizar argumentos en hash% o:
perl -MGetopt::Std -lpe 'BEGIN{getopt("ns",\%o)}; print $o{s} if $. == $o{n}' -- -n 8 -s "Project_Name=sowstest" file
Getopt :: Nombres de opciones largos y más largos
perl -MGetopt::Long -lpe 'BEGIN{GetOptions(\%o,"line=i","string=s")}; print $o{string} if $. == $o{line}' -- --line 8 --string "Project_Name=sowstest" file
Getopt es la solución de biblioteca estándar recomendada.
Esto puede ser excesivo para los scripts de Perl de una línea, pero se puede hacer
fuente
Para aquellos que están en SunOS que no es GNU, el siguiente código ayudará:
fuente
sed -e '8iProject_Name=sowstest' -i start
usando GNU sedEjecución de muestra:
fuente
$
de la línea 3 después de la inserción?-A
bandera acat
:)sed -i "" -e $ '4 a \\ n''Project_Name = sowstest' start
fuente