2012-02-03 16 views
5

Estoy tratando de utilizar operadores de cadena bash en una cadena constante. Por ejemplo, puede hacer lo siguiente en la variable $ foo:Aplicación de operadores de cadena de bash en una cadena constante

$ foo=a:b:c; echo ${foo##*:} 
c 

Ahora, si el "a: b: c" cadena es constante, me gustaría tener una solución más concisa como:

echo ${"a:b:c"##*:} 

Sin embargo, esta no es una sintaxis bash válida. ¿Hay alguna forma de realizar esto? [La razón por la que necesito hacer esto (en lugar de hardcoding el resultado de la sustitución, es decir, "c") es porque tengo una plantilla de comando donde un marcador de posición "% h" es reemplazado por algo antes de ejecutar el mando; el resultado de la sustitución es visto como una constante por bash]

+1

Si las cadenas están delimitadas con un delimitador constante, ¿por qué no utilizar 'awk' o' sed'? –

+0

Sí, también es una opción válida, solo tenía curiosidad sobre cómo se podría hacer esto con los operadores de cadenas de bash, lo cual es un poco más elegante en mi opinión. – a3nm

Respuesta

4

eso no es posible utilizar la expansión de parámetros.

Puede usar otros comandos para esto como sed/awk/expr.

pero no veo el requisito para esto. Se podía hacer:

tmp=%h 
echo ${tmp##*:} 

O si la velocidad no es un problema, y ​​no quieren el desorden del entorno actual con variables que no sean necesarios:

(tmp=%h; echo ${tmp##*:}) 

De todos modos, sería mejor off utilizando la plantilla de comandos para hacer la manipulación de cadenas o usar algo simple corte como:

# get third filed delimited by : 
$ cut -d: -f3<<<'a:b:c' 
c 

o más sofisticados como awk o sed:

#get last field separated by ':' 
$ awk -F: '{print $NF}'<<<'a:b:c' 
c 
$ sed 's/.*:\([^:]*\)/\1/'<<<'a:b:c' 
c 

Depende de lo que necesite.

+0

Mi principal razón para no me gustan las soluciones basadas en 'cut' -'awk' -'sed' es que son ligeramente más largas, y mi razón para no me gusta la solución con la variable intermedia es que esto es para una plantilla de comando que será substituido y 'exec''d, forzándome a envolver el comando en una invocación' bash -c' si quiero agregar una definición de variable. Pero bueno, si no hay forma de hacer lo que pretendo con los operadores de cadenas, puedo usar algo más. ¡Gracias por tu respuesta! – a3nm

2

usted podría utilizar expr para obtener un resultado similar:.

$ expr match "a:b:c" '.*:\(.*\)' 
c 
+0

Genial, no sabía acerca de esta utilidad. – a3nm

1

Usted puede ser capaz de utilizar expresiones regulares Bash juego:

pattern='.*:([^:]+)$' 
[[ "a:b:c" =~ $pattern ]] 
echo "${BASH_REMATCH[1]}" 

Pero por qué no se puede hacer el cambio de plantilla en una asignación de variables, a continuación, utilizar la variable en la expansión de parámetros?

+0

¡Gracias por la respuesta! La razón por la que prefiero evitar el uso de una asignación de variable intermedia si es posible es porque el comando se pasa a 'exec', por lo que tener una asignación de variable me obliga a ajustar esto en otro shell.Además, tenía curiosidad por saber si se puede evitar la asignación de varibale intermedio. – a3nm

Cuestiones relacionadas