Wie kann ich eine Datei programmgesteuert nur mit dem Terminal bearbeiten?

13

Ich möchte ein Shell-Skript schreiben, mit dem ich die Datei aus dem Befehl lesen und bearbeiten kann, ohne manuell eingreifen zu müssen (basierend auf der Suche nach Text und dem Ersetzen durch einen anderen).

Ich brauche keinen Texteditor dafür .... einfach Textsuche (wie mit grep) und dann Ersetzen durch einen anderen Text und Speichern der Änderungen ....

Rohit Bansal
quelle

Antworten:

10

Hier sedkommt das Spiel ins Spiel. Ein sedBefehl hat folgendes Format:

[pattern1][,pattern2][!] command [args]

Es werden reguläre Ausdrücke verwendet, so dass es etwas schwierig sein kann / wird. Einige grundlegende Beispiele aus dem 2. Link unten:

# Ersetze (finde und ersetze) "foo" durch "bar" in jeder Zeile
sed 's / foo / bar /' # ersetzt nur die erste Instanz in einer Zeile
sed 's / foo / bar / 4' # ersetzt nur die 4. Instanz in einer Zeile
sed 's / foo / bar / g' # ersetzt ALLE Instanzen in einer Zeile
sed 's / \ (. * \) foo \ (. * foo \) / \ 1bar \ 2 /' # ersetzen den vorletzten Fall
sed 's / \ (. * \) foo / \ 1bar /' # ersetzt nur den letzten Fall

# ersetze "foo" mit "bar" NUR für Zeilen, die "baz" enthalten
sed '/ baz / s / foo / bar / g'

# Ersetze "foo" mit "bar" AUSSER für Zeilen, die "baz" enthalten
sed '/ baz /! s / foo / bar / g'

# "scarlet" oder "ruby" oder "puce" in "red" ändern
sed / scharlach / rot / g; s / rubin / rot / g; s / puce / rot / g '# die meisten seds
gsed 's / scarlet \ | ruby ​​\ | puce / red / g' # Nur GNU sed

Einige Referenzen

Rinzwind
quelle
6

Sehr späte Antwort. Dies könnte jedoch anderen bei einem ähnlichen Problem / einer ähnlichen Frage helfen.

Ich würde empfehlen, einen Patch zu erstellen und anzuwenden. Ein schönes Beispiel finden Sie hier .

Angenommen, eine new.txt-Datei enthält Änderungen, die Sie auf old.txt anwenden möchten. Sie können die Befehle auf einem Terminal oder durch Erstellen und Ausführen einer patch_file.sh ausführen.

Befehlszeile: Öffnen Sie ein Terminal und kopieren Sie die folgenden Zeilen und führen Sie sie aus (ändern Sie die Dateinamen nach Bedarf):

diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

Skript: Verwenden eines .sh-Dateiansatzes. In einem Terminal (Tastatur: Strg + Alt + T: gedit patch_file.sh

Kopieren Sie die Befehle, die auf dem Terminal ausgeführt werden, und fügen Sie sie in die .sh-Datei unter der Überschrift ein (siehe unten).

#!/bin/sh
diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

Machen Sie das Skript ausführbar (Terminal):

chmod +x patch_file.sh

Führen Sie das Skript (Terminal) aus:

./patch_file.sh # may require sudo access depending on the directory affected
user3832905
quelle
+1 Patch ist immer der direkte Weg für mittlere bis schwere oder komplexe Änderungen. Ich weiß nicht, warum manche versuchen, alles mit Regex-Werkzeugen zu machen.
user.dz
+1 ist so viel besser als das Reverse Engineering einer Regex, die die gewünschte Änderung auf die Datei anzuwenden scheint, mit der Sie testen ... aber wenn sie auf andere Instanzen dieser Datei angewendet wird, hat dies manchmal andere Auswirkungen.
BigJosh
Ist ein Patch sinnvoll, wenn ich alle Instanzen bestimmter Textzeichenfolgen ersetzen möchte, dh alle "" durch "_", alle "minus" durch "-" und alle "gb | <string_of_numbers> | ARO:" durch " ARO: "? Vielen Dank.
Josh
1

Wenn Sie eine Datei bearbeiten möchten, verwenden Sie einen Datei-Editor. Es gibt befehlsbasierte Datei-Editoren, die aus Skripten wie ex oder ed verwendet werden können .

geirha
quelle
1

Du suchst sed oder awk. Ich finde sed einfacher und awk mächtiger.

Hier ist ein Beispiel aus einer anderen Frage .

sed -i 's/gedit.desktop/yournew.desktop/g' /usr/share/applications/defaults.list

Das heisst:

  • suche in datei /usr/share/applications/defaults.list
  • Find / grep gedit.desktop
  • Ersetzen mit yournew.desktop
  • Übernehmen Sie die Änderungen -i
RobotHumans
quelle
0

Je nachdem , was Sie bearbeiten müssen, wenn Sie mit vertraut sind vidann edsinnvoll sein.

Glenn Jackman
quelle