¿Cómo corto todos los caracteres después del último '/'?
Este texto
xxxx/x/xx/xx/xxxx/x/yyyyy
xxx/xxxx/xxxxx/yyy
debería volver
xxxx/x/xx/xx/xxxx/x
xxx/xxxx/xxxxx
command-line
text-processing
Josef Klimuk
fuente
fuente
basename
ydirname
hacer esto ya./
" se convirtió en "¿Cómo corté todos los caracteres después del último '/'?" que es un cambio de fraseo que conserva razonablemente el significado, IMO. En todo caso, sentí que la parte "omitir lo que es ..." es ambigua: los ejemplos parecen mantener lo que está antes del/
. El ejemplo, lo deja claro, de todos modos.Respuestas:
Si quieres obtener la "parte cortada"
Puedes usar
p.ej.
salida
(Nota: Esto usa la capacidad de sed para usar un separador que no sea /, en este caso |, en el comando s)
Si desea obtener el comienzo de la cadena:
Puedes usar
p.ej.
salida
fuente
#
lugar de/
. También puede utilizar la opción-r
si no desea escapar `\` cada carácter especial:sed -r 's#(^.*)/.*$#\1#'
.Si estás cortando fuera de los extremos de las cuerdas,
dirname
podría encajar el proyecto de ley:Si está intentando aislar la última parte de la cadena, use
echo /$(basename "$str")
.fuente
dirname
ybasename
no son ampliamente conocidos, perosed
y loawk
son.cat text | basename
lo tanto no funcionarán. Entonces, una solución adecuada a la pregunta de OP usandodirname
ebasename
involucraría,xargs
etc.Expansión de parámetros en
bash
Puede usar la expansión de parámetros en
bash
, en este caso${parameter%word}
dondeword
esta/*
${parameter##word}
dondeword
esta*/
Ejemplos:
Eliminar la última parte
Esto se describe en
man bash
:Eliminar todo excepto la última parte
Puedes agregar una barra como esta
para obtener exactamente lo que quería en una instancia particular de acuerdo con la pregunta editada. Pero la pregunta ha sido editada por varias personas después de eso y no es fácil saber lo que quieres ahora.
Esto se describe en
man bash
:fuente
Otra forma es usar
grep
para mostrar solo la última barra por línea y lo que sigue:Explicación:
-o
le dicegrep
que solo muestre la parte coincidente de la línea en lugar de la línea completa.El patrón
/[^/]*$
coincide con una barra diagonal/
seguida de cualquier carácter, excepto una barra[^/]
cualquier cantidad de veces*
hasta el final de la línea$
.fuente
Solo porque otros han publicado más respuestas "sensatas", aquí hay una respuesta un tanto tonta:
rev
invierte los caracteres en cada línea, por ejemplo, seabcd/ef/g
convierte eng/fe/dcba
. Luegocut
corta el primer segmento. Finalmente se invierte nuevamente.fuente
Solución clásica con
awk
, que trata/
como un separador de campo tanto para la entrada como para la salida y establece el último campo en una cadena vacía (que realmente es "desreferenciar" de laNF
variable número de campos ):Más breve , como señaló fedorqui en los comentarios:
Una variación de eso sería colocar la ruta en
awk
el entorno de ejecución de la versión, lo que ahorrará en fontanería pero hará que laawk
porción sea más detallada:fuente
NF--
? De esta manera usted avoud elprint
bla bla.Agregando a la respuesta de egmont porque la pregunta ha sido editada ...
Use --complement si desea eliminar el primer campo con -f1 .
Además, la pregunta no es clara sobre qué debería suceder con las entradas que no contienen barras. xxxx => xxxx o xxxx => nada
fuente
--complement
opción antes y la página de manual es circular. Complemento significa complemento. Encontré un bonito tutorial de corte que lo cubre en yourownlinux.com/2015/05/... Es como-v
engrep
. Dame todo, excepto lo que coincida.-f2-
es una forma más simple para-f1 --complement
.