Wie kann ich von der Befehlszeile aus in die zweite Zeile einer Datei schreiben?


29

Ich habe ein externes Programm, das eine Ausgabedatei erzeugt (groß, 20K Zeilen möglich).

Ich muss eine neue Zeile zwischen der vorhandenen Zeile 1 und Zeile 2 einfügen. Ich habe awk und sed betrachtet - ich verwende ziemlich regelmäßig jeweils eine Zeile - aber ich konnte nicht mit den richtigen Schaltern zu kommen mach das.

Antworten:


20
awk 'NR==1{print; print "new line"} NR!=1'

12
Ein bisschen kürzer:awk 'NR==2 {print "new line"} 1'
Glenn Jackman

@glennjackman: Ihre Version funktioniert nicht auf meinem System, aber die Antwort stimmt. Insbesondere wird bei Ihnen Zeile 2 dupliziert und die neue Zeile zwischen beiden eingefügt (so wie Zeile 3).
Nikana Reklawyks

Gibt es eine Möglichkeit, in der 2. Zeile mit dem Schreiben zu beginnen und alle nachfolgenden Zeilen zu überschreiben?
CMCDragonkai

@ CMCDragonkai Ich bin mir nicht ganz sicher, wonach du fragst. Drucken Sie einfach die erste Zeile der angegebenen Datei und eine festgelegte zweite Zeile aus. Erste Zeile und dann der Inhalt einer Datei? Die erste Zeile der ersten Datei und dann eine Zeile aus einer zweiten Datei für jede verbleibende Zeile in der ersten? Möglicherweise möchten Sie eine neue Frage mit einer sehr genauen Beschreibung Ihrer Wünsche und einem relativ kurzen, aber vollständigen Beispiel stellen.
Kevin

16

Für Ihren speziellen Fall sollte dies einfacher sein:

sed '1 { P ; x }' your-file

Erläuterung: Führen Sie in Zeile 1 die folgenden Schritte aus

  1. P RINT die Linie
  2. E x Ändert den Musterraum mit dem Halteraum (leert im Grunde den Puffer)

Anschließend wird die Zeile (jetzt leer) als Teil des Zyklus erneut gedruckt.


Wenn Sie eine neue Zeile anstelle eines neuen Zeilenzeichens hinzufügen möchten (was ich ursprünglich verstanden habe), verwenden Sie einfach sedden Befehl a\(Anhängen):

sed '1 a\
appended line' your-file

oder auch

sed '1 aappended line' your-file

Es wird " appended line" nach Zeile 1 angehängt .


1
sed -i '1 a\\' filefür nur eine newline.
Forcefsck

1
@forcefsck Ja, der einzige Nachteil ist, dass es ein GNUism ist, wie mein zweites '1 aapended line'Beispiel.
Angus

8

Ich denke der sedAnsatz wäre:

sed '2 i whatever_line_of_text_you_wanted_to_INSERT' filename.txt

Dadurch wird der Text in die zweite Zeile der Datei geschrieben, und die eigentliche zweite Zeile in der Datei wird zur dritten.

Beachten Sie, dass im Anhänge-Modus , falls erforderlich , die erste Zeile verwendet werden musste, da das Anhängen nach der angegebenen Zeilennummer erfolgt.

sed '1 a whatever_line_of_text_you_wanted_to_INSERT' filename.txt



2

Das könnte für Sie funktionieren:

sed 1G file

Wenn Sie somethingnach dem Zeilenumbruch einfügen möchten:

sed '1{G;s/$/something/}' file

Oder wenn Sie Griffe sed \n:

sed '1s/$/\nsomething/' file

Natürlich aist es noch einfacher:

sed '1a something' file

Es tut mir leid, was macht es?
Nikhil Mulley

Es fügt eine neue Zeile nach Zeile 1 ein
am

1
Oder hänge lieber eine neue \nZeile an die erste an!
Potong

1

Ich benutze normalerweise eddafür:

(echo 1a; echo 'Line to insert'; echo .; echo w) | ed - filename

Ähnlich wie bei einer sedLösung, jedoch ohne das Durcheinander von entkommenen Zeilenumbrüchen.


2
Sie könnten einige ersparen echo‚s, besonders unter bash: ed - filename <<< $'1a\nLine to insert\n.\nw'.
Manatwork

1
Funktioniert beispielsweise nicht in allen Shells dash, was auf vielen Systemen der Fall ist /bin/sh.
Arcege

1
Deshalb schrieb ich: "Sie könnten einige schonen echo". Sparing all echo ‚s in der Tat ist bashnur Funktion, aber die echoReduktionszahl von 4 auf 1 Werken in dashund kshzu: echo '1a\nLine to insert\n.\nw' | ed - filename.
Handarbeit

1
Oder einfach nur die Verwendungprintf %s\\n , die eine neue Zeile nach jedem arg bringt Sie geben und nicht vermasseln auf Sonderzeichen in der Leitung eingebettet Sie einfügen möchten. Warum auch verwenden, edwenn exverfügbar?
Wildcard

1

Python-Lösung

python -c "import sys; lines = sys.stdin.readlines(); lines.insert(1,'New Line\n'); print ''.join(lines).strip()" < input.txt

0

Verwenden von sedund (Bash-spezifischen) ANSI-Escape-Codes:

# note: \ --> \\
printf '%s\n' 1 2 3 4 5 | sed -e $'1 { s/\\(.*\\)/\\1\\\ninserted line/; }'

0

Ich würde dafür Python verwenden

import fileinput

for linenum,line in enumerate(fileinput,FileInput("file",inplace=1)):
    if linenum ==1:
          print ""
          print line.rstrip() 
      else: 
          print line.rstrip()`

0

Ich benutze einfach gerne einen expliziten Zähler:

awk '(c==1) {print "new line"} (c!=1) {print $0} {c++}' file

0

Einfachste Methode verwendet printfund ex:

printf '%s\n' 1a 'my line to insert' . x | ex file

1abedeutet "nach der ersten Zeile anhängen"; das .beendet das Anhängen; xbedeutet speichern und beenden.


0

In keiner der obigen Antworten wird erwähnt, wie die Änderungen in der Originaldatei gespeichert werden sollen. Ich denke, das OP hat danach gefragt.

Es ist sicherlich das, was ich brauchte, wenn ich auf die Seite kam.

Angenommen, Ihre Datei heißt output.txt

sed -i '1 a This is the second line' output.txt

Mein besonderer Anwendungsfall ist das automatische Hinzufügen einer XML-Stylesheet-Deklaration zu einer Junit-XML-Datei.

sed -i '1 a <?xml-stylesheet type="text/xsl" href="junit-html.xsl"?>' junit.xml

yourownlinux.com/2015/04/… ist der relevante Teil eines gut geschriebenen Intro zu sed.
chim
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.