Luego de investigar con especialistas en la materia, programadores de varias áreas y profesores hemos dado con la solución a la cuestión y la compartimos en este post.
Solución:
los =
son delimitadores alternativos. Se utilizan porque el patrón contiene un /
(que es el delimitador más utilizado). Casi cualquier carácter se puede utilizar como delimitador alternativo, por lo que [email protected]*/@@
o s_.*/__
hubiera significado lo mismo. Con el delimitador ordinario, el sed
expresión podría haberse escrito como
s/.*///
(el literal /
que la expresión quiere coincidir debe escaparse aquí) o, posiblemente más legible,
s/.*[/]//
(la mayoría de los personajes dentro de un [...]
clase de carácter son literales1)
Que sed
expresión hace es sustituir cualquier cosa que coincida .*/
sin nada. Esto tendrá el efecto de eliminar todo hasta e incluyendo el último /
carácter en la línea. Se eliminará hasta el último/
(no el primero) desde .*
hace una coincidencia codiciosa de cualquier secuencia de cualquier carácter.
Ejemplo:
$ echo 'a/b/c' | sed 's/.*[/]//'
c
los unterminated 's' command
error que te da al probar
s798=.*/==/
Es debido a 7
se utiliza como delimitador de la s
mando. La expresion
s7.*/77
aunque hubiera funcionado.
1… aparte de los caracteres que tienen un significado especial dentro [...]
tal como ^
(al principio) y -
(cuando no primero, segundo después ^
, o último). Los caracteres [
and ]
también necesita un trato especial dentro [...]
pero eso va más allá del alcance de esta pregunta.
Si esto se usa para obtener el nombre del archivo al final de una ruta en algunos string o variable de shell, entonces el basename
la utilidad puede hacer un mejor trabajo (y también hace lo correcto si la ruta termina con una barra inclinada):
$ basename a/b/c
c
$ basename a/b/c/
c
Del mismo modo, la sustitución del parámetro de shell estándar $variable##*/
sería, asumiendo que la variable no contiene saltos de línea, sería equivalente en su efecto a pasar el valor de $variable
a través de lo anterior sed
expresión en una sustitución de comando, pero muchas veces más rápido.
La sustitución de variables y la basename
La utilidad también se ocupa del manejo correcto de los nombres de ruta que contienen líneas nuevas, lo que sed
no lo haría (ya que procesa su entrada línea por línea).
De https://backreference.org/2010/02/20/using- different-delimiters-in-sed/:
Es un hecho no tan conocido que sed puede usar cualquier carácter como separador para el comando “s”. Básicamente, sed toma lo que sigue a la “s” como separador.
Entonces, la barra en el medio se convierte en un carácter normal. Si lo estoy interpretando correctamente, su expresión:
s=.*/==
también podría escribirse como:
s/.*///
y explicó como “eliminar cualquier cosa antes de la última barra, incluida la barra”.
Elimina con avidez todos los contenidos antes y /
sí mismo.
Ejemplo:
echo "nsi/wnx/cmedwcm" | sed 's=.*/=='
Producción :
cmedwcm
Aquí =
sirve como delimitador para expresiones regulares (.*/) y reemplazo (null).
Si te mola el asunto, tienes el poder dejar una noticia acerca de qué te ha gustado de esta división.