Respuestas:
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
ed file << END
8i
Project_Name=sowstest
.
w
q
END
.
en su propia línea termina el modo de entrada; w
escribe q
en paz. GNU ed tiene un wq
comando para guardar y salir, pero los ed viejos no.
Lectura adicional: https://gnu.org/software/ed/manual/ed_manual.html
sed
La -i
bandera funciona de manera diferente en macOS sed
que en GNU sed
.
Aquí está la forma de usarlo en macOS / OS X:
sed -i '' '8i\
8 This is Line 8' FILE
Ver man 1 sed
para más información.
la respuesta awk
awk -v n=8 -v s="Project_Name=sowstest" 'NR == n {print s} {print}' file > file.new
#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 X sed
, los sed
siguientes) i
deben ir seguidos de una barra diagonal inversa y una nueva línea. Además, al menos OS X sed
no incluye una nueva línea después del texto insertado:
$ seq 3|gsed '2i1.5'
1
1.5
2
3
$ seq 3|sed '2i1.5'
sed: 1: "2i1.5": command i expects \ followed by text
$ seq 3|sed $'2i\\\n1.5'
1
1.52
3
$ seq 3|sed $'2i\\\n1.5\n'
1
1.5
2
3
Para reemplazar una línea, puede usar los comandos c
(cambiar) o s
(sustituir) con una dirección numérica:
$ seq 3|sed $'2c\\\n1.5\n'
1
1.5
3
$ seq 3|gsed '2c1.5'
1
1.5
3
$ seq 3|sed '2s/.*/1.5/'
1
1.5
3
Alternativas usando awk
:
$ seq 3|awk 'NR==2{print 1.5}1'
1
1.5
2
3
$ seq 3|awk '{print NR==2?1.5:$0}'
1
1.5
3
awk
interpreta las barras diagonales inversas en las variables pasadas con, -v
pero no en las variables pasadas usando ENVIRON
:
$ seq 3|awk -v v='a\ba' '{print NR==2?v:$0}'
1
a
3
$ seq 3|v='a\ba' awk '{print NR==2?ENVIRON["v"]:$0}'
1
a\ba
3
Ambos ENVIRON
y -v
están definidos por POSIX.
Soluciones Perl:
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ínea
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ándarperl -lpe 'BEGIN{$n=shift; $s=shift}; print $s if $. == $n' 8 "Project_Name=sowstest" file
setenv n 8 ; setenv s "Project_Name=sowstest"
echo $n ; echo $s
perl -slpe 'print $ENV{s} if $. == $ENV{n}' file
ENV
es el hash que contiene todas las variables de entorno
perl -MGetopt::Std -lpe 'BEGIN{getopt("ns",\%o)}; print $o{s} if $. == $o{n}' -- -n 8 -s "Project_Name=sowstest" file
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
Para aquellos que están en SunOS que no es GNU, el siguiente código ayudará:
sed '1i\^J
line to add' test.dat > tmp.dat
sed -e '8iProject_Name=sowstest' -i start
usando GNU sed
Ejecución de muestra:
[root@node23 ~]# for ((i=1; i<=10; i++)); do echo "Line #$i"; done > a_file
[root@node23 ~]# cat a_file
Line #1
Line #2
Line #3
Line #4
Line #5
Line #6
Line #7
Line #8
Line #9
Line #10
[root@node23 ~]# sed -e '3ixxx inserted line xxx' -i a_file
[root@node23 ~]# cat -An a_file
1 Line #1$
2 Line #2$
3 xxx inserted line xxx$
4 Line #3$
5 Line #4$
6 Line #5$
7 Line #6$
8 Line #7$
9 Line #8$
10 Line #9$
11 Line #10$
[root@node23 ~]#
[root@node23 ~]# sed -e '5ixxx (inserted) "line" xxx' -i a_file
[root@node23 ~]# cat -n a_file
1 Line #1
2 Line #2
3 xxx inserted line xxx
4 Line #3
5 xxx (inserted) "line" xxx
6 Line #4
7 Line #5
8 Line #6
9 Line #7
10 Line #8
11 Line #9
12 Line #10
[root@node23 ~]#
$
de la línea 3 después de la inserción?
-A
bandera a cat
:)
sed -i "" -e $ '4 a \\ n''Project_Name = sowstest' start