¿Cómo puedo eliminar todo el texto después de un personaje en bash?

¿Cómo puedo eliminar todo el texto después de un personaje, en este caso dos puntos (“:”), en bash? ¿Puedo eliminar los dos puntos también? No tengo idea de cómo hacerlo.

Un ejemplo podría haber sido útil, pero si te entendiera correctamente, esto funcionaría:

echo "Hello: world" | cut -f1 -d":" 

Esto convertirá “hola: mundo” en “hola”.

En Bash (y ksh, zsh, dash, etc.), puede usar la expansión de parámetros con % que eliminará los caracteres del final de la cadena o # que eliminará los caracteres del principio de la cadena. Si usa uno solo de esos caracteres, se eliminará la cadena más pequeña que coincida. Si duplicas el personaje, se eliminará el más largo.

 $ a='hello:world' $ b=${a%:*} $ echo "$b" hello $ a='hello:world:of:tomorrow' $ echo "${a%:*}" hello:world:of $ echo "${a%%:*}" hello $ echo "${a#*:}" world:of:tomorrow $ echo "${a##*:}" tomorrow 
 $ echo 'hello:world:again' |sed 's/:.*//' hello 
 egrep -o '^[^:]*:' 

Supongamos que tiene una ruta con un archivo en este formato:

 /dirA/dirB/dirC/filename.file 

Ahora solo quieres la ruta que incluye cuatro “/”. Tipo

 $ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/" 

y su salida será

 /dirA/dirB/dirC 

La ventaja de utilizar el corte es que también puede cortar el directorio más alto y el archivo (en este ejemplo), así que si escribe

 $ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/" 

su salida sería

 /dirA/dirB 

Aunque puedes hacer lo mismo desde el otro lado de la cuerda, no tendría mucho sentido en este caso, ya que escribir

 $ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/" 

resultados en

 dirA/dirB/dirC 

En algunos otros casos, el último caso también podría ser útil. Tenga en cuenta que no hay “/” al comienzo de la última salida.