Ich muss Text in einer Textdatei durch einen Ersatz ersetzen. Normalerweise würde ich sowas machen
sed -i 's/text/replacement/g' path/to/the/file
Das Problem ist, dass beide text
und replacement
komplexe Zeichenfolgen Bindestriche, Schrägstriche, schwarze Schrägstriche, Anführungszeichen usw. enthalten. Wenn ich alle notwendigen Zeichen in text
der Sache entkomme , wird schnell unlesbar. Andererseits brauche ich keine regulären Ausdrücke: Ich muss den Text nur wörtlich ersetzen.
Gibt es eine Möglichkeit, Text ohne reguläre Ausdrücke mit einem bash-Befehl zu ersetzen ?
Es wäre ziemlich trivial, ein Skript zu schreiben, das dies tut, aber ich denke, es sollte schon etwas geben.
bash
regex
sed
text-editing
Andrea
quelle
quelle
find and replace all
bash
immer mit Microsoft Word ausgeliefert wurden? ;) Nein, ich mache nur Scherze. Möglicherweise möchte das OP dies auf einem Remote-Computer oder für einen Stapel von Dateien tun.sed
, was angesichts aller Switches und Plattformunterschiede wahrscheinlich eine vergebliche Anstrengung ist.Antworten:
Wenn Sie die Potenz regulärer Ausdrücke nicht benötigen, verwenden Sie sie nicht. Das ist gut.
Dies ist jedoch kein regulärer Ausdruck .
sed 's|literal_pattern|replacement_string|g'
Also, wenn
/
es Ihr Problem ist, verwenden|
Sie und Sie müssen nicht ersteren entkommen.ps: zu den Kommentaren siehe auch diese Stackoverflow-Antwort auf Escape a string for sed search pattern .
Update: Wenn Sie sich gut mit Perl versuchen Sie es mit
\Q
und\E
wie diese,perl -pe 's|\Qliteral_pattern\E|replacement_string|g'
RedGrittyBrick
hat auch vorgeschlagen , einen ähnlichen Trick mit stärkerer Perl - Syntax in einem Kommentar hierquelle
s|||
unds///
besteht darin, dass das Trennzeichen unterschiedlich ist und ein Zeichen nicht maskiert werden muss. Das könnte man auch tuns###
. Das eigentliche Problem hierbei ist, dass sich das OP nicht darum kümmern muss, dem Inhalt von zu entkommenliteral_pattern
(was überhaupt nicht wörtlich ist und als regulärer Ausdruck interpretiert wird).1234.*aaa
es mit Ihrer Lösung viel mehr als die beabsichtigten entsprechen1234\.\*aaa
.Dies ist die einzige 100% sichere Lösung, weil:
sed
).}
char enthält (also einer eingereichten Perl-Lösung überlegen)ENV['FIND']
verwendet wird, nicht$FIND
. Mit$FIND
oder Ihrem Text in Ruby-Code können Sie einen Syntaxfehler feststellen, wenn Ihre Zeichenfolge einen ungeschützten Text enthält'
.quelle
export FIND='find this; export REPLACE='replace with this';
in meinem Bash-Skript damit umgehenENV['FIND']
undENV['replace']
hatte die erwarteten Werte. Ich habe einige wirklich lange verschlüsselte Zeichenfolgen in einer Datei ersetzt. Dies war nur das Ticket.Der
replace
Befehl wird dies tun.https://linux.die.net/man/1/replace
Ortswechsel:
Zu stdout:
Beispiel:
Der
replace
Befehl kommt mit MySQL oder MariaDB.quelle
Sie könnten auch in Perl verwenden
\Q
Mechanismus „ Zitat (deaktivieren) Muster Metazeichen “quelle
perl -pe 's(\Qyour */text/?goes"here")(replacement)' file
Schau dir mein Perl-Skript an. Es kann genau das tun, was Sie benötigen, ohne den regulären Ausdruck implizit oder explizit zu verwenden:
https://github.com/Samer-Al-iraqi/Linux-str_replace
sehr praktisch, oder? Ich musste Perl lernen, um es zu tun. weil ich es wirklich wirklich brauche.
quelle
Sie können dies tun, indem Sie Ihren Mustern entkommen . So was:
Credits für diese Lösung finden Sie hier: https://stackoverflow.com/questions/407523/escape-a-string-for-a-sed-replace-pattern
Hinweis 1: Dies funktioniert nur für nicht leere Schlüsselwörter. Leere Keywords werden von sed nicht akzeptiert (
sed -e 's//replacement/'
) .Hinweis 2: Leider kenne ich kein beliebtes Tool, das KEINE regulären Ausdrücke verwenden würde, um das Problem zu lösen. Sie können ein solches Tool in Rust oder C schreiben, es ist jedoch nicht standardmäßig vorhanden.
quelle
Ich habe ein paar andere Antworten zusammengestellt und mir Folgendes ausgedacht:
quelle
\n
. Irgendeine Lösung?Sie können phps str_replace verwenden :
Hinweis: Sie müssten jedoch weiterhin einfache
'
und doppelte Anführungszeichen"
umgehen.quelle
Node.JS-Äquivalent zu @Nowaker:
quelle
Hier ist noch eine "fast" Arbeitsweise.
Benutze vi oder vim.
Erstellen Sie eine Textdatei mit Ihrer Ersetzung:
dann führe vi oder vim von der Kommandozeile aus:
:% sno ist der Befehl vi zum Suchen und Ersetzen ohne Zauberei.
Ich habe das Trennzeichen gewählt.
: x speichert und beendet vi.
Sie müssen Backslashes (umgekehrte Schrägstriche) ausschließen. '\' Der Schrägstrich '/' kann zB durch ein Fragezeichen '?' Ersetzt werden. oder etwas anderes, das nicht in Ihrer Such- oder Ersetzungszeichenfolge enthalten ist, Pipe '|' hat bei mir aber nicht funktioniert.
Ref: https://stackoverflow.com/questions/6254820/perform-a-non-regex-search-replace-in-vim https://vim.fandom.com/wiki/Search_without_need_to_escape_slash http://linuxcommand.org/ lc3_man_pages / vim1.html
quelle