J'ai un fichier de script que je dois modifier avec un autre script pour insérer un texte à la 8ème ligne.
Chaîne à insérer:, Project_Name=sowstest
dans un fichier appelé start
.
J'ai essayé d'utiliser awk et sed, mais ma commande est déformée.
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.
sur sa propre ligne termine le mode d'entrée;w
écrit;q
quitte. GNU ed a unewq
commande pour sauvegarder et quitter, mais pas les anciens ed.Lectures complémentaires: https://gnu.org/software/ed/manual/ed_manual.html
la source
OS X / macOS / FreeBSD
sed
L'
-i
indicateur fonctionne différemment sur macOSsed
que dans GNUsed
.Voici comment l'utiliser sur macOS / OS X:
Voir
man 1 sed
pour plus d'informations.la source
la réponse awk
la source
#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 Xsed
,sed
ci - dessous)i
doivent être suivis d'une barre oblique inverse et d'une nouvelle ligne. De plus, au moins OS Xsed
n'inclut pas de nouvelle ligne après le texte inséré:Pour remplacer une ligne, vous pouvez utiliser les commandes
c
(modifier) ous
(remplacer) par une adresse numérique:Alternatives utilisant
awk
:awk
interprète les barres obliques inverses dans les variables passées avec-v
mais pas dans les variables passées en utilisantENVIRON
:Les deux
ENVIRON
et-v
sont définis par POSIX.la source
Solutions Perl:
rapide et sale:
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équivalent à la solution awk de @ glenn, utilisant des arguments nommés:
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 standardarguments de commande de position:
perl -lpe 'BEGIN{$n=shift; $s=shift}; print $s if $. == $n' 8 "Project_Name=sowstest" file
Variables d'environnement:
ENV
est le hachage qui contient toutes les variables d'environnementGetopt pour analyser les arguments dans le hachage% o:
perl -MGetopt::Std -lpe 'BEGIN{getopt("ns",\%o)}; print $o{s} if $. == $o{n}' -- -n 8 -s "Project_Name=sowstest" file
Getopt :: Noms d'options longs et longs
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
la source
Pour ceux qui utilisent SunOS qui n'est pas GNU, le code suivant aidera:
la source
sed -e '8iProject_Name=sowstest' -i start
en utilisant GNU sedExemple d'exécution:
la source
$
de la ligne 3 après l'insertion?-A
drapeau àcat
:)sed -i "" -e $ '4 a \\ n''Project_Name = sowstest' start
la source