Ich habe eine Datei mit meinen persönlichen Daten (.txt). Wie kann ich über das Terminal nur wenige Details aus der Datei kopieren und in eine neue .txt
Datei einfügen?
Wenn dies beispielsweise der Inhalt der Datei ist:
name : farah age : 23 phone number : 0123 education : degree
Wie kann ich nur Alter und Telefonnummer kopieren und in eine neue .txt
Datei ausgeben ?
command-line
text-processing
MsWanie
quelle
quelle
Antworten:
Es gibt verschiedene Möglichkeiten, dies zu tun. Wenn Ihre Datei eine bekannte Struktur hat, können Sie verwenden
grep
. Dergrep
Befehl durchsucht eine Datei nach einer bestimmten Phrase und gibt Zeilen zurück, die dieser Phrase entsprechen. Also, wenn Ihre Datei aussiehtSie können laufen
grep Name info.txt
und es wird zurückkehrenName: Sally
. Sie können die Ausgabe dann in eine andere Datei umleiten . Also anrufengrep Name info.txt > info2.txt
gibt die Zeile in die neue Datei info2.txt aus. Wenn Sie neue Zeilen anhängen möchten, können Sie dies tun
grep Address info.txt >> info2.txt
Andernfalls wird die Datei überschrieben.
Sie können auch lernen, einen Befehlszeilentexteditor wie vim zu verwenden.
quelle
Mit grep können Sie in details.txt nach einem regulären Ausdruck suchen und das Ergebnis in die neue Datei umleiten.
Wenn alle Zeilen, die Sie kopieren möchten, etwas gemeinsam haben, können Sie die anderen Zeilen nicht verwenden:
Wenn nicht , werden Sie möchten , suchen müssen für jede Zeile kopieren, noch grep, und hängen Sie sie an new.txt Verwendung
>>
anstelle von>
.quelle
Es gibt auch Editoren, die im Terminal arbeiten, z. B. Nano, Vi und Emacs.
Wenn Sie eine grafische Benutzeroberfläche auf Ihrem lokalen Computer und ein Terminal auf einem Remotecomputer verwenden, können Sie auch mit der Maus von einem Terminalfenster / einer Registerkarte in ein zweites kopieren und einfügen.
quelle
Angenommen, die Eingabedatei
details.txt
enthält:Sie können die Zeilen "Name" und "Telefon" durch erweitertes Grep auswählen und die Ausgabe an new.txt umleiten:
Dies erzeugt new.txt mit:
Wie es funktioniert:
Grep druckt nur übereinstimmende Linien. Die
-E
Optionen aktivierten den erweiterten regulären Ausdruck, der Ihnen die Möglichkeit zur Verwendung bietet|
(alternativ). Denken Sie daran, das gesamte Muster zu zitieren, damit|
es von grep interpretiert wird. Andernfalls versucht die Shell zu interpretieren. Das willst du hier nicht.quelle
Die von Ihnen angezeigte Datei enthält alle Details in einer Zeile:
Ich habe angenommen, dass Sie
age :
usw. in den Befehl fest codieren können , aber der darauf folgende Text variiert und dass die Details möglicherweise nicht in der angegebenen Reihenfolge oder zusammenhängend sind.Sie können Teile der Zeile mit
grep
dem-o
Flag von ' extrahieren . Dadurch wird nur der übereinstimmende Teil und nicht die gesamte Zeile gedruckt.Wenn Sie die
age :
undphone number :
Teile einschließen möchten , können Sie entweder das-e
Flag verwenden, um mehrere Übereinstimmungen anzugeben, oder alternieren.Der Ausdruck
[^ ]*
bedeutet eine beliebige Anzahl von Zeichen, die kein Leerzeichen sind, sodass Zeichen nachage :
dem nächsten Leerzeichen übereinstimmen .Ersetzen Sie
file
durch den Namen der Datei, die Ihre Daten enthält. Sie können die neue Datei schreiben, indem Sie die Ausgabe mit dem>
Operator wie folgt in eine neue Datei umleiten :Wenn Sie dies tun, sehen Sie keine Ausgabe. Sie sollten zuerst die Ausgabe überprüfen und dann die Umleitung hinzufügen.
Hier ist das Beispiel mit Wechsel. Wir verwenden das
-E
Flag,grep
um anzugeben, dass ein erweiterter regulärer Ausdruck verwendet werden soll. Die Syntax lautet(pattern1|pattern2)
- dies stimmt übereinpattern1
und / oderpattern2
. Wenn eines gefunden wird, wird es gedruckt (unabhängig davon, ob das andere gefunden wird oder nicht). Ich verwende jetzt die+
Bedeutung mindestens eines der vorhergehenden Zeichen, anstatt*
null oder mehr des vorhergehenden Zeichens zu bedeuten. In diesem Zusammenhang funktionieren beide gleich gut.Wenn Sie die
age :
undphone number:
Teile weglassen möchten , können Sie das-P
Flag verwenden, umgrep
nach Perl-kompatiblen regulären Ausdrücken zu fragen . Dies unterstützt den Wechsel und auch eine Möglichkeit, Text nach einem bestimmten Muster abzugleichen:Wenn Sie den Text anders formatieren möchten, können Sie beispielsweise Folgendes verwenden
sed
:Dies hängt davon ab , ob Sie
age
vorherphone number
kommen. Passen Sie dies entsprechend an, wenn dies nicht der Fall ist. Wenn Sie sich nicht auf die Reihenfolge verlassen können, können Sie diesen sehr komplizierten Befehl verwenden:Dadurch wird die Zeile neu angeordnet, sodass der
phone number :
Abschnitt in jeder Zeile an erster Stelle steht. Anschließend wird ein zweiter Austausch durchgeführt, um die gewünschten Details auszuwählen. Die hier verwendete Technik verdanke ich dieser Antwort von Muru .Hinweise zu
sed
Befehlen, die in den vorherigen Erläuterungen nicht behandelt wurden-r
Verwenden Sie erweiterte Regex für besser lesbare Befehle (GNUsed
versteht-E
mit der gleichen Bedeutung)s/old/new/
ersetzenold
durchnew
(pattern)
Speichert,pattern
um später mit\1
oder\2
usw. zu referenzieren (entsprechend der Reihenfolge von links nach rechts, in der die Erfassungsgruppen auftreten - beachten Sie, dasssed
nur bis zu 7 davon enthalten sind!)..
Ein beliebiges Zeichen steht daher.*
für eine beliebige Anzahl beliebiger Zeichen.;
trennt Befehle wie in der Shell.quelle