Fügen Sie Text an einer bestimmten Zeilennummer ein


12

Ich arbeite an einem Bash-Skript, das den Inhalt eines Textdokuments abhängig von den Daten in der Zeile aufteilt.

Wenn der Inhalt der Originaldatei im Sinne von wäre

01 line
01 line
02 line
02 line

Wie kann ich mit bash in Zeile 3 dieser Datei einfügen, um das Ergebnis zu erhalten?

01 line
01 line
text to insert
02 line
02 line

Ich hoffe, dies mit einem Heredoc oder ähnlichem in meinem Drehbuch zu tun

#!/bin/bash

vim -e -s ./file.txt <<- HEREDOC
    :3 | startinsert | "text to insert\n"
    :update
    :quit
HEREDOC

Das obige funktioniert natürlich nicht, aber irgendwelche Empfehlungen, die ich in dieses Bash-Skript umsetzen könnte?


Antworten:


14

Sie können Vim im Ex-Modus verwenden:

ex -s -c '3i|hello world' -c x file.txt
  1. 3 Zeile 3 anwählen

  2. i Text und Zeilenumbruch einfügen

  3. x schreiben Sie, wenn Änderungen vorgenommen wurden (sie haben) und beenden Sie

Oder durch passende Zeichenfolge:

ex -s -c '/hello/i|world' -c x file.txt

8

sed wäre eine traditionelle Wahl (GNU sed hat wahrscheinlich eine einfachere Form als diese).

$ cat input
01 line
01 line
02 line
02 line
$ sed '2a\
text to insert
' < input
01 line
01 line
text to insert
02 line
02 line
$ 

Oder extrem traditionell ed(Bonus! In-Place-Bearbeitung ohne die nicht portierbare sed -iForm).

$ (echo 2; echo a; echo text to insert; echo .; echo wq) | ed input
32
01 line
47
$ cat input
01 line
01 line
text to insert
02 line
02 line
$ 

(Das hat nichts damit zu tun bash.)


2
bonux ersetzt echo text to insertdurchcat file-to-insert.txt
Archemar

1
Zumindest mit bash, anstatt all dieser echos, könnten Sieprintf '%s\n' 2 a 'text to insert' . wq
Evilsoup

6

Wie wäre es mit so etwas wie:

head -n 2 ./file.txt > newfile.txt
echo "text to insert" >> newfile.txt
tail -n +3 ./file.txt >> newfile.txt
mv newfile.txt file.txt

1
Seltsame, aber interessante Idee +1
Tyþë-Ø

4
$ awk 'NR==3{print "text to insert"}1' a.txt
01 line
01 line
text to insert
02 line
02 line
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.