Was ist der einfachste Weg, um beispielsweise eine bestimmte Eingabezeichenfolge zu suchen und zu ersetzen und durch eine abc
andere Zeichenfolge zu ersetzen, beispielsweise XYZ
in einer Datei /tmp/file.txt
?
Ich schreibe eine App und verwende IronPython, um Befehle über SSH auszuführen - aber ich kenne Unix nicht so gut und weiß nicht, wonach ich suchen soll.
Ich habe gehört, dass Bash nicht nur eine Befehlszeilenschnittstelle ist, sondern auch eine sehr leistungsfähige Skriptsprache sein kann. Wenn dies zutrifft, können Sie vermutlich solche Aktionen ausführen.
Kann ich es mit Bash machen und was ist das einfachste (einzeilige) Skript, um mein Ziel zu erreichen?
sed
:s/..../..../ - Substitute
und/g - Global
invalid command code C
Fehlermeldung erhalten ... Für direkte Ersetzungensed
benötigt BSD eine Dateierweiterung nach dem-i
Flag, da eine Sicherungsdatei mit der angegebenen Erweiterung gespeichert wird. Zum Beispiel:sed -i '.bak' 's/find/replace/' /file.txt
Sie können die Sicherung überspringen, indem Sie eine leere Zeichenfolge wie folgt verwenden:sed -i '' 's/find/replace/' /file.txt
s/abc/XYZ/gi
Die Dateimanipulation wird normalerweise nicht von Bash durchgeführt, sondern von Programmen, die von Bash aufgerufen werden, z.
Das
-i
Flag weist ihn an, einen direkten Austausch durchzuführen.Sehen Sie
man perlrun
für weitere Informationen, einschließlich , wie eine Sicherungskopie der Originaldatei zu übernehmen.quelle
perl -pi -e 's/chdir (?:\\/[\\w\\.\\-]+)+/chdir blah/g' text
, aber es wird immer wieder die Fehlermeldung angezeigt, dass in Zeile 1 kein Leerzeichen zwischen dem Muster und dem folgenden Wort veraltet ist. Nicht übereinstimmend (in Regex; markiert mit <- HIER in m / (chdir) () (<- HIER) ?: \\ / at -e Zeile 1.Ich war überrascht, als ich darüber stolperte ...
Es gibt einen
replace
Befehl, der mit dem"mysql-server"
Paket geliefert wird. Wenn Sie ihn installiert haben, probieren Sie ihn aus:Weitere
man replace
Informationen hierzu finden Sie hier.quelle
replace
ist ein nützliches unabhängiges Tool und die MySQL-Leute sollten es separat veröffentlichen und davon abhängen b)replace
erfordert ein bisschen MySQL o_O In beiden Fällen wäre es falsch, den MySQL-Server zu installieren, um ihn zu ersetzen :)mysql-server
Paket installiert haben. Wie von @rayro gezeigt,replace
ist ein Teil davon.Dies ist ein alter Beitrag, aber für alle, die Variablen verwenden möchten, wie @centurian sagte, bedeuten die einfachen Anführungszeichen, dass nichts erweitert wird.
Eine einfache Möglichkeit, Variablen abzurufen, besteht darin, eine Zeichenfolgenverkettung durchzuführen, da dies durch Nebeneinanderstellung in Bash erfolgt. Folgendes sollte funktionieren:
quelle
Bash ist wie andere Shells nur ein Werkzeug zum Koordinieren anderer Befehle. Normalerweise würden Sie versuchen, Standard-UNIX-Befehle zu verwenden, aber Sie können natürlich Bash verwenden, um alles aufzurufen, einschließlich Ihrer eigenen kompilierten Programme, anderer Shell-Skripte, Python- und Perl-Skripte usw.
In diesem Fall gibt es verschiedene Möglichkeiten.
Wenn Sie eine Datei lesen und in eine andere Datei schreiben möchten, während Sie suchen / ersetzen, verwenden Sie sed:
Wenn Sie die Datei an Ort und Stelle bearbeiten möchten (als ob Sie die Datei in einem Editor öffnen, bearbeiten und dann speichern würden), geben Sie dem Zeileneditor 'ex' Anweisungen.
Ex ist wie vi ohne den Vollbildmodus. Sie können ihm dieselben Befehle geben, die Sie an der Eingabeaufforderung ':' von vi ausführen würden.
quelle
Ich habe diesen Thread unter anderem gefunden und bin damit einverstanden, dass er die vollständigsten Antworten enthält, also füge ich auch meinen hinzu:
sed
unded
sind so nützlich ... von Hand. Schauen Sie sich diesen Code von @Johnny an:Wenn meine Einschränkung darin besteht, es in einem Shell-Skript zu verwenden, kann keine Variable anstelle von "abc" oder "XYZ" verwendet werden. Die BashFAQ scheint zumindest mit dem übereinzustimmen , was ich verstehe. Also kann ich nicht verwenden:
aber was können wir tun? Wie, sagte @Johnny, benutze ein
while read...
aber leider ist das nicht das Ende der Geschichte. Folgendes hat bei mir gut funktioniert:Wie man sehen kann, wenn
nullglob
dann gesetzt ist, verhält es sich seltsam, wenn es einen String gibt, der ein*
wie in enthält:was wird
Es gibt keine Endwinkelklammer und Apache2 kann nicht einmal geladen werden.
Diese Art der Analyse sollte langsamer sein als das Suchen und Ersetzen mit einem Treffer. Wie Sie bereits gesehen haben, gibt es vier Variablen für vier verschiedene Suchmuster, die in einem Analysezyklus ausgeführt werden.
Die am besten geeignete Lösung, die ich mir mit den gegebenen Annahmen des Problems vorstellen kann.
quelle
sed -e "s/$x/$y/"
, und es wird funktionieren. Nicht die doppelten Anführungszeichen. Es kann sehr verwirrend werden, wenn die Zeichenfolgen in den Variablen selbst Zeichen mit besonderer Bedeutung enthalten. Zum Beispiel, wenn x = "/" oder x = "\". Wenn Sie auf diese Probleme stoßen, sollten Sie wahrscheinlich aufhören, die Shell für diesen Job zu verwenden.Sie können verwenden
sed
:Verwenden
-i
Sie diese Option für "Groß- / Kleinschreibung ignorieren", wenn Sie nicht sicher sind, ob der zu findende Textabc
oderABC
oderAbC
usw. ist.Sie können verwenden
find
undsed
wenn Sie Ihren Dateinamen nicht kennen:Suchen und ersetzen Sie in allen Python-Dateien:
quelle
Sie können den
ed
Befehl auch verwenden , um in der Datei zu suchen und zu ersetzen:Weitere Informationen finden Sie unter " Bearbeiten von Dateien über Skripte mit
ed
".quelle
sed -i <pattern> <filename>
). Sehr schön!Wenn die Datei, an der Sie arbeiten, nicht so groß ist und das vorübergehende Speichern in einer Variablen kein Problem darstellt, können Sie die Bash-String-Ersetzung für die gesamte Datei gleichzeitig verwenden. Sie müssen sie nicht Zeile für Zeile durchgehen:
Der gesamte Dateiinhalt wird als eine lange Zeichenfolge behandelt, einschließlich Zeilenumbrüchen.
XYZ kann z. B. eine Variable sein
$replacement
, und ein Vorteil der Nichtverwendung von sed besteht darin, dass Sie nicht befürchten müssen, dass die Such- oder Ersetzungszeichenfolge das Begrenzungszeichen sed-Muster enthält (normalerweise, aber nicht unbedingt, /). Ein Nachteil ist, dass keine regulären Ausdrücke oder komplexere Operationen von sed verwendet werden können.quelle
Seien Sie vorsichtig, wenn Sie URLs durch "/" ersetzen.
Ein Beispiel dafür:
Auszug aus: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html
quelle
Versuchen Sie den folgenden Shell-Befehl:
quelle
sed
. Verwenden Siesed -i''
stattdessen.Um Text in der Datei nicht interaktiv zu bearbeiten, benötigen Sie einen direkten Texteditor wie vim.
Hier ist ein einfaches Beispiel für die Verwendung über die Befehlszeile:
Dies entspricht der @ lim-Antwort des Ex- Editors, was im Grunde dasselbe ist.
Hier einige
ex
praktische Beispiele.Ersetzen von Text
foo
durchbar
in der Datei:Entfernen von nachgestellten Leerzeichen für mehrere Dateien:
Fehlerbehebung (wenn das Terminal feststeckt):
-V1
param hinzu, um ausführliche Nachrichten anzuzeigen.-cwq!
.Siehe auch:
quelle
-V1
, zum Beenden erzwingen, verwendenwq!
.Sie können Python auch im Bash-Skript verwenden. Ich hatte mit einigen der besten Antworten hier nicht viel Erfolg und fand, dass dies ohne die Notwendigkeit von Schleifen funktioniert:
quelle
Sie können den Befehl rpl verwenden. Zum Beispiel möchten Sie den Domainnamen im gesamten PHP-Projekt ändern.
Dies ist kein klarer Grund, aber es ist sehr schnell und nützlich. :) :)
quelle