Réponses:
sed -i '8i8 This is Line 8' FILE
inserts à la ligne 8
8 This is Line 8
dans le fichier FILE
-i effectue la modification directement dans le fichier FILE, pas de sortie vers stdout, comme mentionné dans les commentaires de glenn jackman.
brew install gnu-sedpuis utilisez-le avecgsed
sed '8i\ 8 This is Line 8' FILE.
Une edréponse
ed file << END
8i
Project_Name=sowstest
.
w
q
END
.sur sa propre ligne termine le mode d'entrée; wécrit; qquitte. GNU ed a une wqcommande pour sauvegarder et quitter, mais pas les anciens ed.
Lectures complémentaires: https://gnu.org/software/ed/manual/ed_manual.html
sedL' -iindicateur fonctionne différemment sur macOS sedque dans GNU sed.
Voici comment l'utiliser sur macOS / OS X:
sed -i '' '8i\
8 This is Line 8' FILE
Voir man 1 sedpour plus d'informations.
la réponse 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"sur une ligne particulière. Comment puis-je atteindre cet objectif?
>est le symbole de redirection du shell pour que la sortie de awk soit stockée dans le fichier nommé "file.new".
POSIX sed(et par exemple OS X sed, sedci - dessous) idoivent être suivis d'une barre oblique inverse et d'une nouvelle ligne. De plus, au moins OS X sedn'inclut pas de nouvelle ligne après le texte inséré:
$ 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
Pour remplacer une ligne, vous pouvez utiliser les commandes c(modifier) ou s(remplacer) par une adresse numérique:
$ 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
Alternatives utilisant 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
awkinterprète les barres obliques inverses dans les variables passées avec -vmais pas dans les variables passées en utilisant 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
Les deux ENVIRONet -vsont définis par POSIX.
Solutions Perl:
perl -lpe 'print "Project_Name=sowstest" if $. == 8' file
-l supprime les nouvelles lignes et les rajoute, éliminant ainsi le besoin de "\ n"-p boucle sur le fichier d'entrée, imprimant chaque ligne-e exécute le code entre guillemets simples$. est le numéro de ligne
perl -slpe 'print $s if $. == $n' -- -n=8 -s="Project_Name=sowstest" file
-s active un analyseur d'arguments rudimentaire-- empêche -n et -s d'être analysés par l'analyseur d'arguments perl standardperl -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 est le hachage qui contient toutes les variables d'environnement
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 est la solution de bibliothèque standard recommandée.
Cela peut être excessif pour les scripts perl sur une ligne, mais cela peut être fait
Pour ceux qui utilisent SunOS qui n'est pas GNU, le code suivant aidera:
sed '1i\^J
line to add' test.dat > tmp.dat
sed -e '8iProject_Name=sowstest' -i start en utilisant GNU sed
Exemple d'exécution:
[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 ligne 3 après l'insertion?
-Adrapeau à cat:)
sed -i "" -e $ '4 a \\ n''Project_Name = sowstest' start