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

298
Vistas
Sed: can not replace part of the string whithout replacing all of it

I am trying to replace part of the string, but can not find a proper regex for sed to execute it properly.

I have a string /abc/foo/../bar And I would like to achive the following result: /abc/bar

I have tried to do it using this command:

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

But as result I am getting just /bar.

I understand that I must use group, but I just do not get it. Could you, please, help me to find out this group that could be used?

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

0

You can use

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

See the online demo. Details:

  • -n - suppresses default line output
  • E - enables POSIX ERE regex syntax
  • ^ - start of string
  • (/[^/]*) - Group 1: a / and then zero or more chars other than /
  • (/.*)? - an optional group 2: a / and then any text
  • /\.\. - a /.. fixed string
  • (/[^/]*) - Group 3: a / and then zero or more chars other than /
  • .* - the rest of the string.
  • \1\3 replaces the match with Group 1 and 3 values concatenated
  • p only prints the result of successful substitution.
over 4 years ago · Santiago Trujillo Denunciar

0

You can use a capture group for the first part and then match until the last / to remove.

As you are using / to match in the pattern, you can opt for a different delimiter.

#!/bin/bash
string="/abc/foo/../bar"

sed 's~\(/[^/]*/\)[^:-]*/~\1~' <<< "$string"

The pattern in parts:

  • \( Capture group 1
    • /[^/]*/ Match from the first till the second / with any char other than / in between
  • \) Close group 1
  • [^:-]*/ Match optional chars other than : and - then match /

Output

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

0

Using sed

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

or

$ 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