2010-11-12 12 views

Respuesta

82

Un ejemplo podría haber sido útil, pero si he entendido bien, esto funcionaría:

cut -f1 -d":" 

Esto convertirá "hola: mundo" en "hola".

+4

'cut' funciona, pero la respuesta de Dennis es mejor y más flexible. ¿Alguien sabe si genera un nuevo proceso como 'cortar'? – JoBu1324

+2

Es mejor usar las funciones de expansión de parámetros incorporadas de Bash que generar subcapas que ejecutan herramientas como 'basename' y' cut', ver la respuesta de Dennis debajo de –

+0

'cut' puede leer de stdin, por lo que es mejor especialmente cuando tienes un cadena que necesita procesar, como el contenido de un archivo. – Sahas

3
egrep -o '^[^:]*:' 
+0

puede explicar cómo interpretar esto, gracias. –

+1

'egrep' es grep con' -E'. No hace ninguna diferencia aquí desde 'grep 'regular. '-o' ordena a grep que imprima solo la parte de la línea que coincide con la expresión. '^' ancla la coincidencia al inicio de una línea. '[^:] *' coincide con cero o más caracteres que no son el carácter ':'. ':' coincide con el caracter ':'. – cdhowie

+0

Gracias de nuevo por la explicación –

166

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 
+3

Esto es manipulación de cadena de shell nativa, por lo que no se generarán procesos adicionales.Referencia [Sustitución del parámetro Bash] (http://tldp.org/LDP/abs/html/parameter-substitution.html#PARAMSUBREF), [Bash String Manipulation] (http://tldp.org/LDP/abs/html/ string-manipulation.html) y [Better Bash Scripting] (http://robertmuth.blogspot.jp/2012/08/better-bash-scripting-in-15-minutes.html) –

+0

@denniswilliamson Cómo podría eliminar 2 caracteres después de que una cadena específica como 'hello: world' se convierta en' hello: wo' usando '$ {a%: *}'? – 3kstc

+0

Gran respuesta, muchas gracias, pero también sería bueno agregar '" $ {a ## *:} "' para obtener solo 'tomorrow' =) – avtomaton

4
$ echo 'hello:world:again' |sed 's/:.*//' 
hello 
0

Digamos que usted tiene un camino con un archivo en este formato:

/dirA/dirB/dirC/filename.file 

Ahora sólo desea que 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 usar corte es que también se puede cortar el directorio uppest, así como el archivo (en este ejemplo), por lo que si se escribe

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

su salida sería

/dirA/dirB 

Aunque se puede hacer lo mismo desde el otro lado de la cadena, que no tendría mucho sentido en este caso como 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.

Cuestiones relacionadas