Ersetzung in Textdatei **ohne** reguläre Ausdrücke

Ersetzung in Textdatei **ohne** reguläre Ausdrücke

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 textals auch replacementkomplexe Zeichenfolgen sind, die Bindestriche, Schrägstriche, schwarze Schrägstriche, Anführungszeichen usw. enthalten. Wenn ich alle erforderlichen Zeichen darin maskiere, textwird 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 \Qund \Eso,

 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 $FINDoder Ihrem in Ruby-Code eingebetteten Text könnte ein Syntaxfehler auftreten, wenn Ihr String ein nicht maskiertes enthielte '.

Antwort3

Der replaceBefehl 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 replaceBefehl wird mit MySQL oder MariaDB geliefert.

Antwort4

Sie können auch den Mechanismus von Perl verwenden, \Qum „Anführungszeichen (deaktivieren) Muster-Metazeichen"

perl -pe 'BEGIN {$text = q{your */text/?goes"here"}} s/\Q$text\E/replacement/g'

verwandte Informationen