¿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

basenameydirnamehacer 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-rsi no desea escapar `\` cada carácter especial:sed -r 's#(^.*)/.*$#\1#'.Si estás cortando fuera de los extremos de las cuerdas,
dirnamepodría encajar el proyecto de ley:Si está intentando aislar la última parte de la cadena, use
echo /$(basename "$str").fuente
dirnameybasenameno son ampliamente conocidos, perosedy loawkson.cat text | basenamelo tanto no funcionarán. Entonces, una solución adecuada a la pregunta de OP usandodirnameebasenameinvolucraría,xargsetc.Expansión de parámetros en
bashPuede usar la expansión de parámetros en
bash, en este caso${parameter%word}dondewordesta/*${parameter##word}dondewordesta*/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
greppara mostrar solo la última barra por línea y lo que sigue:Explicación:
-ole dicegrepque 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:
revinvierte los caracteres en cada línea, por ejemplo, seabcd/ef/gconvierte eng/fe/dcba. Luegocutcorta 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 laNFvariable 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
awkel entorno de ejecución de la versión, lo que ahorrará en fontanería pero hará que laawkporción sea más detallada:fuente
NF--? De esta manera usted avoud elprintbla 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
--complementopció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-vengrep. Dame todo, excepto lo que coincida.-f2-es una forma más simple para-f1 --complement.