2017-04-02 5 views
-2

Ich habe gelernt, über sed und finde es sehr nützlich, aber kann keine Antwort auf diese in vielen der Führer und Beispiele ... Ich möchte den Dateinamen einfügen eine Textdatei ohne Pfad und Erweiterung in eine bestimmte Zeile innerhalb des Textes. Möglich?Dateinamen in Textdatei mit sed einfügen

+0

Ich empfehle, mehr Informationen über die Umwelt bereitzustellen. Ich prophezeie Lösungsvorschläge über Shell-Variablenaustausch. Bitte geben Sie die Art der Shell an, die Sie verwenden. Auch andere Informationen können helfen, vielleicht konsultieren (http://stackoverflow.com/help/mcve). – Yunnosch

+0

Ja, tut mir leid. Linux Ubuntu 16.04.2 und GNU sed 4.2.2 – raysa

Antwort

1

In solchen Fällen sollte der richtige Startpunkt man-Seiten sein. Handbuch von sed bietet keine Funktion für sed, um "Dateiname" zu verstehen, aber sed unterstützt das Einfügen eines Textes vor/nach einer Zeile.

Als Ergebnis müssen Sie den Dateinamen separat isolieren, speichern Sie den Text auf eine Variable und injizieren Sie diesen Text nach/vor der gewünschten Zeile.

Beispiel:

$ a="/home/gv/Desktop/PythonTests/cpu.sh" 
$ a="${a##*/}";echo "$a" 
cpu.sh 
$ a="${a%.*}"; echo "$a" 
cpu 

$ cat file1 
LOCATION 0 X 0 
VALUE 1a 2 3 
VALUE 1b 2 3 
VALUE 1c 2 3 

$ sed "2a $a" file1 # Inject the contents of variable $a after line2 
LOCATION 0 X 0 
VALUE 1a 2 3 
cpu 
VALUE 1b 2 3 
VALUE 1c 2 3 

$ sed "2i $a" file1 # Inject the contetns of variable $a before line2 
LOCATION 0 X 0 
cpu 
VALUE 1a 2 3 
VALUE 1b 2 3 
VALUE 1c 2 3 

$ sed "2a George" file1 #Inject a fixed string "George" after line 2 
LOCATION 0 X 0 
VALUE 1a 2 3 
George 
VALUE 1b 2 3 
VALUE 1c 2 3 

Erläuterung:
a="${a##*/}": Entfernt alle Zeichen vom Anfang der Zeichenfolge oben gefunden Slash zum letzten/(länger Spiel)
a="${a%.*}": Alle Zeichen löschen Ende des Start String bis zum ersten gefundenen Punkt. (kurzes Spiel) Sie können %% auch für den am längsten gefundenen Punkt verwenden.
sed "2a $a": Legen Sie nach der Zeile 2 der Inhalt der Variable $ a
sed "2i $q": Legen Sie vor Zeile 2 den Inhalt von $ a

Optional können Sie sed -i verwenden, um Änderungen an Ort und Stelle/in Datei unter Prozess

1

wrt I've been learning about sed dann haben Sie vielleicht Ihre Zeit verschwendet, da es nicht viel über sed über s/old/new hinaus zu lernen gibt. Natürlich gibt es eine Menge anderer Sprachkonstrukte und Dinge, die Sie mit sed machen könnten, aber in der Praxis sollten Sie sie alle vermeiden und stattdessen einfach awk verwenden. Wenn Sie Ihre Frage so bearbeiten, dass sie eine prägnante, testbare Beispieleingabe und eine erwartete Ausgabe enthält und ein awk-Tag hinzufügt, können wir Ihnen zeigen, wie Sie alles tun können, was Sie wollen, um den richtigen Weg zu gehen.

Inzwischen klingt es wie alles, was Sie brauchen, ist:

$ cat /usr/tmp/file 
a 
b 
c 
d 
e 

$ awk 'NR==3{print gensub(/.*\//,"",1,FILENAME)} 1' /usr/tmp/file 
a 
b 
file 
c 
d 
e 

Die oben genannten Einsätze der aktuellen Dateinamen vor Zeile 3 der geöffneten Datei. Es verwendet GNU awk für gensub(), mit anderen awks verwenden Sie einfach sub() und eine Variable.

+0

Gute Punkte, aber Sie fehlen die Entfernung der Dateinamenerweiterung (Suffix). – mklement0

+0

Wir werden sehen, welche Art von Beispiel Eingabe/Ausgabe das OP bietet ... –

+1

Jeden Tag jetzt. :) – mklement0

Verwandte Themen