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=sowstesten 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-sedy luego usen esto congsedsed '8i\ 8 This is Line 8' FILE.Una
edrespuesta.en su propia línea termina el modo de entrada;wescribeqen paz. GNU ed tiene unwqcomando 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
sedLa
-ibandera funciona de manera diferente en macOSsedque en GNUsed.Aquí está la forma de usarlo en macOS / OS X:
Ver
man 1 sedpara 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, lossedsiguientes)ideben ir seguidos de una barra diagonal inversa y una nueva línea. Además, al menos OS Xsedno 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:awkinterpreta las barras diagonales inversas en las variables pasadas con,-vpero no en las variables pasadas usandoENVIRON:Ambos
ENVIRONy-vestán definidos por POSIX.fuente
Soluciones Perl:
rápido y sucio:
perl -lpe 'print "Project_Name=sowstest" if $. == 8' file-lelimina las nuevas líneas y las agrega nuevamente, eliminando la necesidad de "\ n"-precorre el archivo de entrada, imprimiendo cada línea-eejecuta 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-spermite 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" fileVariables de entorno:
ENVes 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" fileGetopt :: 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" fileGetopt 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 startusando GNU sedEjecución de muestra:
fuente
$de la línea 3 después de la inserción?-Abandera acat:)sed -i "" -e $ '4 a \\ n''Project_Name = sowstest' start
fuente