Sed ohne Regex

632
sagar

Ich verwende GNU SED zum Suchen und Ersetzen von Funktionen für große Dateien (bis zu 2 GB).

Suchen und Ersetzen von Zeichen können beliebige Zeichen enthalten. Daher möchte ich, dass Such- und Ersetzungsparameter als einfacher Text behandelt werden, sobald er kommt.

Ich möchte weder das Suchen oder Ersetzen von Parametern als Regex durch den Sed-Befehl behandeln.

Ich habe viel experimentiert, aber jedes Mal bekomme ich neue Kombinationen von Regex, die nicht für sed als Klartext funktionieren.

Wie kann das erreicht werden?

Gibt es eine Formel, um die Sonderzeichen zu umgehen?

Hinweis: Ich benutze ~Operator anstelle von als Befehlsseparator/

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 find -Parameter als Regex behandelt (da er Regex ist). Um den Text zu finden, müssen einige Sonderzeichen in Regex wie folgt gekennzeichnet werden

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 (.*$) ich möchte die Eingabe nicht mofifizieren.

Gibt es also eine universelle Regel für die Escape-Sequenz?

0
Könnten Sie genauer sein? Beispieleingabe und erwartete Ausgabe zum Beispiel. Thor vor 11 Jahren 0
Verwenden Sie Anführungszeichen anstelle von Anführungszeichen, dann lässt die Shell diese Zeichen in Ruhe. Thor vor 11 Jahren 0
aber es wirft folgenden Fehler sed: -e Ausdruck # 1, Zeichen 1: unbekannter Befehl: `'' sagar vor 11 Jahren 0
Sie vermissen ein abschließendes "~". Welche Version von Sed ist das? Thor vor 11 Jahren 0
sed -ne 's ~ ad ~ sss ~ g' -ne 'w output.txt' 'input.txt' Dies ist mein Befehl, der den Fehler angibt. Und sed Version ist => GNU Sed Version 4.2.1 sagar vor 11 Jahren 0
Dieser Befehl funktioniert hier. Thor vor 11 Jahren 0
@Thor Es funktioniert nicht an meiner Eingabeaufforderung. Kann sed verison ein Problem sein? sagar vor 11 Jahren 0
Ich habe die gleiche Version. Versuchen Sie, den Befehl erneut einzugeben. Thor vor 11 Jahren 0
leider funktioniert es nicht :-( sagar vor 11 Jahren 0
Ich stimme mit @Thor in zwei Punkten überein: (1) Der Befehl `sed -ne 's ~ ad ~ sss ~ g' -ne 'w output.txt' 'input.txt' 'sieht vollkommen gültig aus und funktioniert auf meinem System. (2) Sie müssen Ihr Problem besser erklären. Sie sagen, Sie möchten eine "Universalregel", nachdem Sie gesagt haben, dass einige Charaktere sich wörtlich darstellen sollen, während andere ihre Regex-Funktionen implementieren. Scott vor 11 Jahren 0
Ich möchte nur nicht Regex Verhalten von sed Befehl. Ich möchte, dass alle vorgebrachten Argumente für Suchen und Ersetzen als unformatierter Text behandelt werden sagar vor 11 Jahren 0
Hallo Leute, danke für deine Antworten! Mein Problem wurde gelöst. Ich laufe über Sed-Version auf Windows 7. Ich habe folgende Syntax von Sed verwendet. sed -nre "s ~ a \ .d ~ sss ~ g; w output.txt" "input.txt". Da ich -r als Option verwendet habe, entkomme ich allen Sonderzeichen, die im regulären Ausdruck verwendet werden. sagar vor 11 Jahren 0

1 Antwort auf die Frage

1
POW

F: Gibt es eine Formel, um die Sonderzeichen zu umgehen?
F: Gibt es eine universelle Regel für die Escape-Sequenz?

A: Sie können die entsprechenden Hex - Code für Sonderzeichen verwendet werden, in Fällen, in denen nur die Eingabe /, ., *, ?, $etc. wird ärgerlich. Zum Beispiel:

sed -rn '/\x22/p' file 

druckt Zeilen, die doppelte Anführungszeichen enthalten, da \x22repräsentiert ".

Wenn Sie Hex-Codes nachschlagen müssen, können Sie sie alle bequem mit diesem Befehl in einer Datei speichern:

gawk 'BEGIN}' null >chars.txt 
Dies scheint direkt die zwei klaren Fragen zu beantworten, die das OP stellt. simlev vor 7 Jahren 1