Ich muss Text in einer Textdatei durch einen Ersatz ersetzen. Normalerweise würde ich so etwas tun wie
sed -i 's/text/replacement/g' path/to/the/file
Das Problem ist, dass sowohl text
als auch replacement
komplexe Zeichenfolgen sind, die Bindestriche, Schrägstriche, schwarze Schrägstriche, Anführungszeichen usw. enthalten. Wenn ich alle erforderlichen Zeichen darin maskiere, text
wird das Ding schnell unlesbar. Andererseits brauche ich nicht die Leistung regulärer Ausdrücke: Ich muss den Text nur wörtlich ersetzen.
Gibt es eine Möglichkeit, Text zu ersetzenohneVerwenden von regulären Ausdrücken mit einigen Bash-Befehlen?
Es wäre ziemlich trivial, ein Skript zu schreiben, das dies tut, aber ich nehme an, dass es dafür bereits etwas geben müsste.
Antwort1
Wenn Sie die Leistungsfähigkeit regulärer Ausdrücke nicht benötigen, verwenden Sie sie nicht. Das ist in Ordnung.
Aber das ist nicht wirklich einregulären Ausdruck.
sed 's|literal_pattern|replacement_string|g'
Wenn dies also /
Ihr Problem ist, verwenden Sie es, |
und Sie müssen Ersteres nicht verlassen.
PS: Zu den Kommentaren siehe auch diese Stackoverflow-Antwort aufEscapen Sie eine Zeichenfolge für das Sed-Suchmuster.
Aktualisieren: Wenn Sie damit einverstanden sindPerlVersuchen Sie es mit \Q
und \E
so,
perl -pe 's|\Qliteral_pattern\E|replacement_string|g'
@RedGrittyBrick hat in einem Kommentar auch einen ähnlichen Trick mit stärkerer Perl-Syntax vorgeschlagenHieroderHier
Antwort2
export FIND='find this'
export REPLACE='replace with this'
ruby -p -i -e "gsub(ENV['FIND'], ENV['REPLACE'])" path/to/file
Dies ist hier die einzige 100% sichere Lösung, denn:
- Es handelt sich um eine statische Ersetzung und nicht um einen regulären Ausdruck. Es muss nichts maskiert werden (und ist daher der Verwendung von überlegen
sed
). - Es wird nicht unterbrochen, wenn Ihr String
}
Zeichen enthält (und ist daher einer eingereichten Perl-Lösung überlegen). - Es wird bei keinem Zeichen unterbrochen, da
ENV['FIND']
verwendet wird und nicht$FIND
. Mit$FIND
oder Ihrem in Ruby-Code eingebetteten Text könnte ein Syntaxfehler auftreten, wenn Ihr String ein nicht maskiertes enthielte'
.
Antwort3
Der replace
Befehl führt dies aus.
https://linux.die.net/man/1/replace
Ortswechsel:
replace text replacement -- path/to/the/file
Zur Standardausgabe:
replace text replacement < path/to/the/file
Beispiel:
$ replace '.*' '[^a-z ]{1,3}' <<EOF
> r1: /.*/g
> r2: /.*/gi
> EOF
r1: /[^a-z ]{1,3}/g
r2: /[^a-z ]{1,3}/gi
Der replace
Befehl wird mit MySQL oder MariaDB geliefert.
Antwort4
Sie können auch den Mechanismus von Perl verwenden, \Q
um „Anführungszeichen (deaktivieren) Muster-Metazeichen"
perl -pe 'BEGIN {$text = q{your */text/?goes"here"}} s/\Q$text\E/replacement/g'