Ci sono due livelli di interpretazione qui: il guscio e sed.
Nella shell, tutto tra virgolette singole viene interpretato letteralmente, ad eccezione delle virgolette singole stesse. Puoi effettivamente avere una virgoletta singola tra virgolette singole scrivendo '\''
(chiudi virgoletta singola, virgoletta singola letterale, apri virgoletta singola).
Sed usa espressioni regolari di base . In un BRE, per poterli trattare letteralmente, i personaggi $.*[\^
devono essere citati precedendoli da una barra rovesciata, ad eccezione dei set di caratteri interni ( […]
). Lettere, cifre e (){}+?|
non devono essere citati (è possibile cavarsela citando alcuni di questi in alcune implementazioni). Le sequenze \(
, \)
, \n
, e in alcune implementazioni \{
, \}
, \+
, \?
, \|
e altri backslash + alfanumerici hanno un significato particolare. Puoi evitare di non citare $^
alcune posizioni in alcune implementazioni.
Inoltre, è necessario prima una barra rovesciata /
se deve apparire nella regex al di fuori delle espressioni parentesi. Puoi scegliere un carattere alternativo come delimitatore scrivendo, ad esempio, s~/dir~/replacement~
oppure \~/dir~p
; avrai bisogno di una barra rovesciata prima del delimitatore se vuoi includerlo nel BRE. Se scegli un personaggio che ha un significato speciale in un BRE e vuoi includerlo letteralmente, avrai bisogno di tre barre rovesciate; Non lo consiglio, poiché potrebbe comportarsi diversamente in alcune implementazioni.
In breve, per sed 's/…/…/'
:
- Scrivi la regex tra virgolette singole.
- Utilizzare
'\''
per finire con una singola citazione nella regex.
- Metti una barra rovesciata prima
$.*/[\]^
e solo quei caratteri (ma non all'interno delle espressioni tra parentesi). (Tecnicamente non dovresti mettere una barra rovesciata prima, ]
ma non conosco un'implementazione che tratta ]
e in modo \]
diverso al di fuori delle espressioni parentesi.)
- All'interno di un'espressione tra parentesi, per
-
essere trattato alla lettera, assicurati che sia il primo o l'ultimo ( [abc-]
o [-abc]
, non [a-bc]
).
- All'interno di un'espressione tra parentesi quadre, per
^
essere trattati letteralmente, assicurarsi che sia non prima (uso [abc^]
, non è [^abc]
).
- Per includere
]
nell'elenco dei caratteri corrispondenti a un'espressione di parentesi quadre, impostalo come primo carattere (o il primo dopo ^
per un set negato): []abc]
oppure [^]abc]
(not [abc]]
nor[abc\]]
).
Nel testo di sostituzione:
&
e \
devono essere citati precedendoli da una barra rovesciata, così come il delimitatore (di solito /
) e le nuove righe.
\
seguito da una cifra ha un significato speciale. \
seguita da una lettera ha un significato speciale (caratteri speciali) in alcune implementazioni e \
seguita da altri mezzi \c
o in c
base all'implementazione.
- Con virgolette singole attorno all'argomento (
sed 's/…/…/'
), utilizzare '\''
per inserire una virgoletta singola nel testo sostitutivo.
Se il regex o il testo sostitutivo provengono da una variabile shell, ricordatelo
- La regex è una BRE, non una stringa letterale.
- Nella regex, una nuova riga deve essere espressa come
\n
(che non corrisponderà mai a meno che non si disponga di altro sed
codice per aggiungere caratteri di nuova riga allo spazio del modello). Ma nota che non funzionerà all'interno delle espressioni parentesi con alcune sed
implementazioni.
- Nel testo sostitutivo,
&
, \
e ritorni a capo devono essere citato.
- Il delimitatore deve essere citato (ma non all'interno delle espressioni tra parentesi).
- Utilizzare le virgolette doppie per l'interpolazione:
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