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-sed
puis utilisez-le avecgsed
sed '8i\ 8 This is Line 8' FILE
.
Une ed
réponse
ed file << END
8i
Project_Name=sowstest
.
w
q
END
.
sur sa propre ligne termine le mode d'entrée; w
écrit; q
quitte. GNU ed a une wq
commande pour sauvegarder et quitter, mais pas les anciens ed.
Lectures complémentaires: https://gnu.org/software/ed/manual/ed_manual.html
sed
L' -i
indicateur fonctionne différemment sur macOS sed
que dans GNU sed
.
Voici comment l'utiliser sur macOS / OS X:
sed -i '' '8i\
8 This is Line 8' FILE
Voir man 1 sed
pour 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
, sed
ci - dessous) i
doivent être suivis d'une barre oblique inverse et d'une nouvelle ligne. De plus, au moins OS X sed
n'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
awk
interprète les barres obliques inverses dans les variables passées avec -v
mais 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 ENVIRON
et -v
sont 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?
-A
drapeau à cat
:)
sed -i "" -e $ '4 a \\ n''Project_Name = sowstest' start