Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

295
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!