Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

300
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda