Aquí hay dos niveles de interpretación: el caparazón y sed.
En el shell, todo entre comillas simples se interpreta literalmente, excepto las comillas simples. Puede escribir una cita simple entre comillas simples '\''
(comilla simple cerrada, una comilla simple literal, comilla simple abierta).
Sed usa expresiones regulares básicas . En un BRE, para que sean tratados literalmente, los caracteres $.*[\^
deben ser citados precediéndolos con una barra diagonal inversa, excepto dentro de los conjuntos de caracteres ( […]
). Las letras, los dígitos y (){}+?|
no se deben citar (puede salirse con la cita de algunos de estos en algunas implementaciones). Las secuencias \(
, \)
, \n
, y, en algunas implementaciones \{
, \}
, \+
, \?
, \|
y otra barra invertida + alfanuméricos tienen significados especiales. Puede salirse con la suya sin cotizar $^
en algunas posiciones en algunas implementaciones.
Además, necesita una barra invertida antes /
si va a aparecer en la expresión regular fuera de las expresiones de paréntesis. Puede elegir un carácter alternativo como delimitador escribiendo, por ejemplo, s~/dir~/replacement~
o \~/dir~p
; necesitará una barra invertida antes del delimitador si desea incluirlo en el BRE. Si elige un personaje que tiene un significado especial en un BRE y desea incluirlo literalmente, necesitará tres barras invertidas; No recomiendo esto, ya que puede comportarse de manera diferente en algunas implementaciones.
En pocas palabras, para sed 's/…/…/'
:
- Escribe la expresión regular entre comillas simples.
- Use
'\''
para terminar con una comilla simple en la expresión regular.
- Ponga una barra diagonal inversa antes
$.*/[\]^
y solo esos caracteres (pero no dentro de las expresiones entre corchetes). (Técnicamente, no deberías poner una barra invertida antes, ]
pero no conozco una implementación que trate ]
y de manera \]
diferente fuera de las expresiones de paréntesis).
- Dentro de una expresión de paréntesis, para
-
que se trate literalmente, asegúrese de que sea el primero o el último ( [abc-]
o [-abc]
no [a-bc]
).
- Dentro de una expresión de paréntesis, para
^
que se trate literalmente, asegúrese de que no sea primero (use [abc^]
, not [^abc]
).
- Para incluir
]
en la lista de caracteres que coinciden con una expresión de paréntesis, conviértalo en el primer carácter (o el primero después ^
de un conjunto negado): []abc]
o [^]abc]
(no [abc]]
ni[abc\]]
).
En el texto de reemplazo:
&
y \
deben ser citados precediéndolos con una barra diagonal inversa, al igual que el delimitador (generalmente /
) y las nuevas líneas.
\
seguido de un dígito tiene un significado especial. \
seguido de una letra tiene un significado especial (caracteres especiales) en algunas implementaciones, y \
seguido de algún otro medio de caracteres \c
o c
dependiendo de la implementación.
- Con comillas simples alrededor del argumento (
sed 's/…/…/'
), use '\''
para poner una comilla simple en el texto de reemplazo.
Si la expresión regular o el texto de reemplazo proviene de una variable de shell, recuerde que
- La expresión regular es un BRE, no una cadena literal.
- En la expresión regular, una nueva línea debe expresarse como
\n
(que nunca coincidirá a menos que tenga otro sed
código que agregue caracteres de nueva línea al espacio del patrón). Pero tenga en cuenta que no funcionará dentro de las expresiones de paréntesis con algunas sed
implementaciones.
- En el texto de reemplazo,
&
, \
y saltos de línea deben ser citado.
- El delimitador necesita ser citado (pero no dentro de las expresiones de paréntesis).
- Utilizar comillas dobles para la interpolación:
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