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?
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 predeterminadaE - 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 concatenadosp solo imprime el resultado de una sustitución exitosa.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/barUsando sed
$ sed 's#^\(/[^/]*\)/.*\(/\)#\1\2#' input_file /abc/baro
$ sed 's#[^/]*/[^/]*/##2' input_file /abc/bar