Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

292
Vistas
Sed: no se puede reemplazar parte de la cadena sin reemplazarla toda

Estoy tratando de reemplazar parte de la cadena, pero no puedo encontrar una expresión regular adecuada para que sed la ejecute correctamente.

Tengo una cadena /abc/foo/../bar Y me gustaría lograr el siguiente resultado: /abc/bar

He intentado hacerlo usando este comando:

echo $string | sed 's/\/[^:-]*\..\//\//'

Pero como resultado obtengo solo /bar .

Entiendo que debo usar el grupo, pero simplemente no lo entiendo. ¿Podría, por favor, ayudarme a encontrar este grupo que podría usarse?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Puedes usar

 #!/bin/bash string='/abc/foo/../bar' sed -nE 's~^(/[^/]*)(/.*)?/\.\.(/[^/]*).*~\1\3~p' <<< "$string"

Vea la demostración en línea . Detalles :

  • -n - suprime la salida de línea predeterminada
  • E - habilita la sintaxis de expresiones regulares POSIX ERE
  • ^ - comienzo de la cadena
  • (/[^/]*) - Grupo 1: un / y luego cero o más caracteres que no sean /
  • (/.*)? - un grupo opcional 2: a / y luego cualquier texto
  • /\.\. - una /.. cadena fija
  • (/[^/]*) - Grupo 3: un / y luego cero o más caracteres que no sean /
  • .* - el resto de la cadena.
  • \1\3 reemplaza la coincidencia con los valores del Grupo 1 y 3 concatenados
  • p solo imprime el resultado de una sustitución exitosa.
over 4 years ago · Santiago Trujillo Denunciar

0

Puede usar un grupo de captura para la primera parte y luego hacer coincidir hasta la última / para eliminar.

Como está usando / para hacer coincidir el patrón, puede optar por un delimitador diferente.

 #!/bin/bash string="/abc/foo/../bar" sed 's~\(/[^/]*/\)[^:-]*/~\1~' <<< "$string"

El patrón en partes:

  • \( Grupo de captura 1
    • /[^/]*/ Coincide desde el primero hasta el segundo / con cualquier carácter que no sea / entre medio
  • \) Cerrar grupo 1
  • [^:-]*/ Coincidencia de caracteres opcionales que no sean : y - luego coincidencia /

Producción

 /abc/bar
over 4 years ago · Santiago Trujillo Denunciar

0

Usando sed

 $ sed 's#^\(/[^/]*\)/.*\(/\)#\1\2#' input_file /abc/bar

o

 $ sed 's#[^/]*/[^/]*/##2' input_file /abc/bar
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda