Ich verwende GNU SED für die Suchen- und Ersetzen-Funktion bei großen Dateien (bis zu 2 GB).
Die Such- und Ersetzungszeichen können beliebige Zeichen enthalten, daher möchte ich, dass die Such- und Ersetzungsparameter so behandelt werden, wie sie vorliegen, und zwar so, wie sie sind.
Ich möchte weder Such- noch Ersetzungsparameter durch den Sed-Befehl als reguläre Ausdrücke behandeln.
Ich habe viel experimentiert, aber jedes Mal erhalte ich neue Kombinationen von regulären Ausdrücken, die für sed als einfacher Text nicht funktionieren.
Wie kann dies erreicht werden?
Gibt es eine Formel, um die Sonderzeichen zu maskieren?
Hinweis: Ich verwende ~
den Operator als Befehlstrennzeichen anstelle von/
Unten ist das Beispiel
sed -ne "s~^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$~Replace" -ne "w output.txt" "input.txt"
Der obige Befehl funktioniert nicht, da er den Suchparameter als regulären Ausdruck behandelt (da es sich um einen regulären Ausdruck handelt). Um den Text zu finden, muss ich daher einige Sonderzeichen im regulären Ausdruck maskieren, wie unten dargestellt
sed -ne "s~\^\[-+\]?\[0-9\]\*\\.?\[0-9\]+(\[eE\]\[-+\]?\[0-9\]+)?\$~Replace" -ne "w output.txt" "input.txt"
In einem anderen Beispiel muss ich ändern, .*$
aber .\*\$
in (.*$)
möchte ich die Eingabe nicht ändern.
Gibt es also eine universelle Regel für Escape-Sequenzen?
Antwort1
Q:Gibt es eine Formel, um die Sonderzeichen zu maskieren?
Q:Gibt es eine universelle Regel für Escape-Sequenzen?
A:Sie können den entsprechenden Hex-Code für Sonderzeichen verwenden, wenn das Eintippen von /
, .
, *
, ?
, $
, usw. lästig wird. Beispiel:
sed -rn '/\x22/p' file
druckt Zeilen, die doppelte Anführungszeichen enthalten, da \x22
darstellt "
.
Wenn Sie Hex-Codes nachschlagen müssen, können Sie sie alle bequem mit diesem Befehl in einer Datei speichern:
gawk 'BEGIN{for(i=0;i<255;i++){printf("%d\t%x\t%c\n", i,i,i)}}' null >chars.txt