Saltar al contenido

¿Qué caracteres necesito para escapar cuando uso sed en un script sh?

Este dilema se puede tratar de variadas maneras, sin embargo te mostramos la respuesta más completa para nosotros.

Solución:

Aquí hay dos niveles de interpretación: el shell y sed.

En el shell, todo lo que se encuentra entre comillas simples se interpreta literalmente, excepto las comillas simples. Puede tener efectivamente una cita simple entre comillas simples escribiendo ''' (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 personajes PS[^ need to be quoted by preceding them by a backslash, except inside character sets ([…]). Letras, dígitos y ()+?| no se debe citar (puede salirse con la suya citando algunos de estos en algunas implementaciones). Las secuencias (, ), n, y en algunas implementaciones , , +, ?, | y otros caracteres alfanuméricos de barra invertida + tienen significados especiales. Puedes salirte con la tuya sin citar $^ 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 corchetes. 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 carácter 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.
  • Usar ''' para terminar con una comilla simple en la expresión regular.
  • Ponga una barra invertida antes $.*/[]^ y solo esos caracteres (pero no las expresiones entre corchetes). (Técnicamente, no deberías poner una barra invertida antes ] pero no conozco una implementación que trate ] y ] diferente fuera de las expresiones de corchetes.)
  • Dentro de una expresión de corchetes, para - para ser tratado literalmente, asegúrese de que sea el primero o el último ([abc-] o [-abc], no [a-bc]).
  • Dentro de una expresión de corchetes, para ^ para ser tratado literalmente, asegúrese de que sea no primer uso [abc^], no [^abc]).
  • Para incluir ] en la lista de caracteres que coinciden con una expresión entre corchetes, conviértalo en el primer carácter (o primero después ^ para un conjunto negado): []abc] o [^]abc] (no [abc]] ni [abc]]).

En el texto de reemplazo:

  • & y deben ser citados precediéndolos por una barra invertida, al igual que el delimitador (generalmente /) y 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 carácter significa c o c dependiendo de la implementación.
  • Con comillas simples alrededor del argumento (sed 's/…/…/'), usar ''' 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 BRE, no literal string.
  • En la expresión regular, una nueva línea debe expresarse como n (que nunca coincidirá a menos que tenga otros sed código que agrega caracteres de nueva línea al espacio del patrón). Pero tenga en cuenta que no funcionará dentro de las expresiones de corchetes con algunos sed implementaciones.
  • En el texto de reemplazo, &, y se deben citar las nuevas líneas.
  • El delimitador debe estar entre comillas (pero no entre corchetes).
  • Utilice comillas dobles para la interpolación: sed -e "s/$BRE/$REPL/".

El problema que está experimentando no se debe a la interpolación de shell y los escapes, es porque está intentando usar la sintaxis de expresión regular extendida sin pasar sed el -r o --regexp-extended opción.

Cambia tu línea sed de

sed 's/(127.0.1.1)s/1/' [some file]

a

sed -r 's/(127.0.1.1)s/1/' [some file]

y funcionará como creo que pretendes.

Por defecto, sed uses usa expresiones regulares básicas (piense en el estilo grep), que requerirían la siguiente sintaxis:

sed 's/(127.0.1.1)[ t]/1/' [some file]

A menos que desee interpolar una variable de shell en la expresión sed, use comillas simples para toda la expresión porque hacen que todo entre ellas se interprete como está, incluidas las barras diagonales inversas.

Entonces, si quieres sed para ver s/(127.0.1.1)s/1/ ponga comillas simples alrededor y el shell no tocará los paréntesis ni las barras diagonales inversas en él. Si necesita interpolar una variable de shell, coloque solo esa parte entre comillas dobles. P.ej

sed 's/(127.0.1.1)/'"$ip"'/'

Esto le evitará la molestia de recordar qué metacaracteres de shell no se escapan entre comillas dobles.

Te mostramos las comentarios y valoraciones de los usuarios

Más adelante puedes encontrar las observaciones de otros sys admins, tú de igual manera eres capaz dejar el tuyo si te gusta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *