Wie füge ich über die Befehlszeile eine Zeile oben in eine Textdatei ein?

25

Ich möchte Text oben in eine bereits vorhandene Datei einfügen. Wie kann ich das erreichen? Ich habe es versucht echound war teeaber nicht erfolgreich.

Ich habe versucht, eine Repo-Zeile sources.listvom Terminal oben in die Datei einzufügen .

Hinweis

Ich brauche eine einzeilige schnelle Lösung, da mir die Methode einer anderen Antwort bereits bekannt war

Anwar
quelle
1
tee fügt am Ende der Datei eine Zeile hinzu, z. B. echo "deb http://extras.ubuntu.com/ubuntu precise main" | sudo tee -a /etc/apt/sources.list- Sie benötigen außerdem sudo vor tee, um Administratorrechte zu erhalten. Aber warum um alles in der Welt möchten Sie etwas ganz oben auf der sources.list hinzufügen?
Savvas Radevic,
2
@medigeek: Irgendwo in der Fragenhistorie des OP findest du etwas über das Installieren / Aktualisieren von einem CD-Repo ... Ich vermute, das könnte der Grund sein ...
ish
Vielen Dank @izx, Ihre Annahme ist richtig. Ich bin ziemlich beeindruckt. Können Sie diese Frage auch beantworten? Dabei ging es darum, von einem lokalen Repository mit Hilfe des Software-Centers zu installieren und mein lokales Repository auf höchste Priorität zu setzen, ohne es ganz oben zu platzieren. Danke noch einmal.
Anwar
1
@izx, Hier ist der Link zum Festlegen der höchsten Priorität für mein lokales Repository. Ich freue mich, wenn Sie auch diese Frage zum Software-Center prüfen können . Nochmals vielen Dank für Ihren ersten Kommentar. war sehr froh.
Anwar
1
@medigeek, Sie können diese Frage zur Erklärung einer solchen ungewöhnlichen Frage sehen.
Anwar

Antworten:

38

Es ist eigentlich ganz einfach mit sed:

  • sed -i -e '1iHere is my new top line\' filename

  • 1iweist sed an, den folgenden Text in Zeile 1 der Datei einzufügen; Vergessen Sie nicht die \neue Zeile am Ende, damit die vorhandene Zeile 1 in Zeile 2 verschoben wird.

ish
quelle
1
Vielen Dank. Nur für den Hinweis: Wenn Sie ersetzen möchten, verwenden Sie sanstelle von i in , anstatt einzufügen 1i.
Anwar
3
Leider schlägt dies für die leere Datei fehl (sie hat keine erste Zeile, also setzt sed nie ein).
Tino
@Tino Für leere Dateien können Sie nur verwendenecho "Text Here" >> Filename
Flotolk
funktioniert nicht unter MacOS 10
Krishna
7

Im Allgemeinen ist das Bearbeiten mit einem Skript schwierig, aber Sie können echound catund dann verwendenmv

echo "fred" > fred.txt
cat fred.txt t.txt >new.t.txt
# now the file new.t.txt has a new line "fred" at the top of it
cat new.t.txt
# can now do the rename/move
mv new.t.txt t.txt

Allerdings , wenn Sie spielen mit sources.list müssen Sie in einiger Validierung und hinzuzufügen Kugel Schutz zu Fehlern usw. zu erkennen , weil Sie wirklich nicht , dies verlieren mögen. Das ist aber eine andere Frage :-)

Sean
quelle
Das kann ich schon Ich brauche eine einzeilige Lösung, wie es izx gab. aber danke für deine antwort.
Anwar
1
@ AnwarShah - ah sorry! Das hättest du in deiner Frage sagen sollen :-)
Sean
Ich gebe zu, +1 für Ihre Antwort und auch für Kommentar. (Ich kann nicht mehr geben)
Anwar
6
./prepend.sh "myString" ./myfile.txt

Bekanntlich prependist das meine benutzerdefinierte Shell :

#!/bin/sh
#add Line at the top of File
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

Verwenden Sie auch einen relativen oder absoluten Pfad, es sollte funktionieren:

./prepend.sh "my New Line at Top"  ../Documents/myfile.txt

Update:

Wenn Sie ein permanentes Skript dafür wollen, öffnen Sie es nano /etc/bash.bashrcund fügen Sie diese Funktion am Ende der Datei hinzu:

function prepend(){
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

}

Öffnen Sie Ihr Terminal und genießen Sie:

prepend "another line at top" /path/to/my/file.txt
Abdennour TOUMI
quelle
5

Und warum nicht einen echten Texteditor verwenden? ed ist der Standard-Texteditor.

ed -s filename <<< $'1i\nFIRST LINE HERE\n.\nwq'

Oder wenn Sie möchten, dass die Befehle besser lesbar sind:

ed -s filename < <(printf '%s\n' 1i "FIRST LINE" . wq)
  • 1: zur ersten Zeile gehen
  • i: Einfügemodus
  • Ihre Sachen, die Sie einfügen möchten ...
  • .: Einfügen beenden, zum normalen Modus zurückkehren
  • wq: schreiben und aufhören, danke, auf Wiedersehen.
gniourf_gniourf
quelle
Wie verwende ich dabei die Substitution von Shell-Variablen (im FIRST LINE)?
vp_arth
1
@vp_arth Wenn Ihre Inhalte in Variable ist first_linedann: ed -s filename < <(printf '%s\n' 1i "$first_line" . wq). Stellen Sie sicher, dass die Variable nicht zu einem einzelnen Punkt erweitert wird und keine Zeilenumbrüche enthält (bereinigen Sie sie also, wenn sie von einer Benutzereingabe stammt).
gniourf_gniourf
3

Es gibt immer die awkMöglichkeit. Ersetzen Sie die stringVariable durch Ihren Inhalt. Dies ist jedoch keine direkte Änderung. Persönlich neige ich dazu, keine Änderungen an Ort und Stelle vorzunehmen. Dies ist definitiv eine persönliche Präferenz. Zwei Dinge -vbedeuten, dass eine Variable in awk und Variable nhier verwendet wird, um effektiv mit einer Zeilennummer übereinzustimmen NR == 1. Sie können dies auf verschiedene Arten nutzen, indem Sie einfach den Wert von nund ändern s.

string="My New first line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}'     file.source > file.target

Beispiel:

% cat file.source                                                                                                                                      

First Line
Second Line
Third Line

% string="Updated First Line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}' file.source > file.target; cat ./file.target                      !698

Updated First Line
First Line
Second Line
Third Line
Schrägstrich
quelle
2

Sie können Vim im Ex-Modus verwenden:

ex -sc '1i|hello world' -cx sources.list
  1. 1 1. Zeile auswählen

  2. i Neue Textzeile einfügen

  3. x speichern und schließen

Steven Penny
quelle
Viel einfacher als andere bisher angebotene Lösungen. Vielen Dank.
Pothi Kalimuthu