Ich habe eine Skriptdatei, die ich mit einem anderen Skript ändern muss, um einen Text in die 8. Zeile einzufügen.
Zu fügender String : Project_Name=sowstest
, in eine Datei mit dem Namen start
.
Ich habe versucht, awk und sed zu verwenden, aber mein Befehl wird verstümmelt.
brew install gnu-sed
und verwenden Sie diese mitgsed
sed '8i\ 8 This is Line 8' FILE
.Eine
ed
Antwort.
auf seiner eigenen Leitung endet der Eingabemodus;w
schreibt;q
quitt. GNU ed hat einenwq
Befehl zum Speichern und Beenden, alte Eds jedoch nicht.Weitere Informationen: https://gnu.org/software/ed/manual/ed_manual.html
quelle
OS X / macOS / FreeBSD
sed
Das
-i
Flag funktioniert unter macOS anderssed
als in GNUsed
.So verwenden Sie es unter macOS / OS X:
Siehe
man 1 sed
für weitere Informationen.quelle
die awk antwort
quelle
#define SERVER@"http://10.35.42.54/ms0.8"
eine bestimmte Zeile eingeben . Wie kann ich das erreichen?>
ist das Shell- Umleitungssymbol, damit die Ausgabe von awk in der Datei "file.new" gespeichert wird.Auf POSIX
sed
(und zum Beispiel auf OS Xsed
, siehesed
unten) müsseni
ein Backslash und ein Zeilenumbruch folgen. Zumindest OS Xsed
enthält nach dem eingefügten Text keine neue Zeile:Um eine Zeile zu ersetzen, können Sie die Befehle
c
(Ändern) oders
(Ersetzen) mit einer numerischen Adresse verwenden:Alternativen mit
awk
:awk
interpretiert Backslashes in Variablen, die mit übergeben wurden,-v
aber nicht in Variablen, die übergeben wurden mitENVIRON
:Beide
ENVIRON
und-v
werden von POSIX definiert.quelle
Perl-Lösungen:
schnell und dreckig:
perl -lpe 'print "Project_Name=sowstest" if $. == 8' file
-l
entfernt Zeilenumbrüche und fügt sie wieder hinzu, sodass "\ n" nicht mehr benötigt wird.-p
Durchläuft die Eingabedatei und druckt jede Zeile-e
führt den Code in einfachen Anführungszeichen aus$.
ist die ZeilennummerEntspricht der awk-Lösung von @ glenn mit benannten Argumenten:
perl -slpe 'print $s if $. == $n' -- -n=8 -s="Project_Name=sowstest" file
-s
aktiviert einen rudimentären Argumentparser--
verhindert, dass -n und -s vom Standard-Perl-Argument-Parser analysiert werdenPositionsbefehlsargumente:
perl -lpe 'BEGIN{$n=shift; $s=shift}; print $s if $. == $n' 8 "Project_Name=sowstest" file
Umgebungsvariablen:
ENV
ist der Hash, der alle Umgebungsvariablen enthältGetopt, um Argumente in Hash% o zu analysieren:
perl -MGetopt::Std -lpe 'BEGIN{getopt("ns",\%o)}; print $o{s} if $. == $o{n}' -- -n 8 -s "Project_Name=sowstest" file
Getopt :: Lange und längere Optionsnamen
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 ist die empfohlene Standardbibliothekslösung.
Dies kann für einzeilige Perl-Skripte übertrieben sein, kann aber durchgeführt werden
quelle
Für diejenigen, die unter SunOS arbeiten, das kein GNU ist, hilft der folgende Code:
quelle
sed -e '8iProject_Name=sowstest' -i start
mit GNU sedProbelauf:
quelle
$
in Zeile 3 nach dem Einfügen?-A
Flagge biscat
:)sed -i "" -e $ '4 a \\ n''Project_Name = sowstest' start
quelle