Hier gibt es zwei Interpretationsebenen: die Shell und sed.
In der Shell wird alles zwischen einfachen Anführungszeichen wörtlich interpretiert, mit Ausnahme von einfachen Anführungszeichen. Sie können effektiv ein einfaches Anführungszeichen zwischen einfachen Anführungszeichen setzen, indem Sie schreiben '\''
( einfaches Anführungszeichen schließen, einfaches Anführungszeichen wörtlich, einfaches Anführungszeichen öffnen).
Sed verwendet grundlegende reguläre Ausdrücke . In einer BRE müssen die Zeichen $.*[\^
in Anführungszeichen gesetzt werden, damit sie buchstäblich behandelt werden, mit Ausnahme der in Zeichensätzen ( […]
) enthaltenen Schrägstriche . Buchstaben, Ziffern und (){}+?|
dürfen nicht in Anführungszeichen gesetzt werden (einige davon können in einigen Implementierungen nicht in Anführungszeichen gesetzt werden). Die Sequenzen \(
, \)
, \n
, und in einigen Implementierungen \{
, \}
, \+
, \?
, \|
und andere Backslash + alphanumerics haben eine besondere Bedeutung. $^
In einigen Implementierungen kann es passieren, dass Sie in einigen Positionen nicht zitieren .
Darüber hinaus benötigen Sie einen Backslash, bevor /
er im regulären Ausdruck außerhalb von Klammern angezeigt werden soll. Sie können ein alternatives Zeichen als Trennzeichen auswählen, indem Sie schreiben, z. B. s~/dir~/replacement~
oder \~/dir~p
; Sie benötigen einen Backslash vor dem Begrenzer, wenn Sie ihn in die BRE aufnehmen möchten. Wenn Sie ein Zeichen auswählen, das in einer BRE eine besondere Bedeutung hat, und es buchstäblich einschließen möchten, benötigen Sie drei umgekehrte Schrägstriche. Ich empfehle dies nicht, da es sich in einigen Implementierungen anders verhalten kann.
Kurz gesagt, für sed 's/…/…/'
:
- Schreiben Sie den regulären Ausdruck in einfache Anführungszeichen.
- Verwenden Sie
'\''
diese Option, um ein einfaches Anführungszeichen im regulären Ausdruck zu erhalten.
- Setzen Sie einen Backslash vor
$.*/[\]^
und nur diese Zeichen (aber nicht in Klammern). (Technisch gesehen sollte man nicht einen umgekehrten Schrägstrich setzen , bevor ]
aber ich weiß nicht von einer Implementierung , die behandelt ]
und \]
außerhalb der Klammerausdrücke anders.)
-
Um buchstäblich behandelt zu werden, stellen Sie in einem Klammerausdruck sicher, dass er der erste oder letzte ist ( [abc-]
oder [-abc]
nicht [a-bc]
).
^
Um buchstäblich behandelt zu werden, stellen Sie in einem Klammerausdruck sicher, dass er nicht an erster Stelle steht (use [abc^]
, not [^abc]
).
- Wenn Sie
]
in die Liste der Zeichen aufnehmen möchten, die mit einem Klammerausdruck übereinstimmen, geben Sie als erstes Zeichen (oder als erstes nach ^
einem negierten Satz) Folgendes an: []abc]
oder [^]abc]
(weder [abc]]
noch[abc\]]
).
Im Ersetzungstext:
&
und \
müssen in Anführungszeichen gesetzt werden, ebenso wie das Trennzeichen (normalerweise /
) und die Zeilenumbrüche.
\
gefolgt von einer Ziffer hat eine besondere Bedeutung. \
gefolgt von einem Buchstaben hat in einigen Implementierungen eine spezielle Bedeutung (Sonderzeichen), \
gefolgt von einem anderen Zeichen \c
oder c
abhängig von der Implementierung.
sed 's/…/…/'
Verwenden Sie einfache Anführungszeichen um das Argument ( ), '\''
um ein einfaches Anführungszeichen in den Ersetzungstext einzufügen.
Wenn der reguläre Ausdruck oder der Ersetzungstext aus einer Shell-Variablen stammt, denken Sie daran
- Der reguläre Ausdruck ist eine BRE, keine wörtliche Zeichenfolge.
- In der regulären Ausdrucksweise muss eine neue Zeile wie folgt ausgedrückt werden
\n
(was niemals zutrifft, es sei denn, Sie haben einen anderen sed
Code, der dem Musterraum Zeichen für neue Zeilen hinzufügt). Beachten Sie jedoch, dass dies bei einigen sed
Implementierungen nicht in Klammern funktioniert .
- Im Ersetzungstext müssen
&
, \
und Zeilenumbrüche zitiert werden.
- Das Trennzeichen muss in Anführungszeichen gesetzt werden (jedoch nicht in Klammern).
- Verwenden Sie doppelte Anführungszeichen für die Interpolation:
sed -e "s/$BRE/$REPL/"
.
function sedPath { path=$((echo $1|sed -r 's/([\$\.\*\/\[\\^])/\\\1/g'|sed 's/[]]/\[]]/g')>&1) } #Escape path for use with sed