2011-01-29 9 views
5

deseo escribir una secuencia de comandos de la concha de pescado para inicializar JAVA_HOME automáticamente a la alternativa java configurada actual.Manipulación de cadenas en la concha de pescado

En bash se vería así (lo siento por el doble nombredir fea)

j=`update-alternatives --query javac | grep Value:` 
JAVA_HOME=`dirname ${j#Value:}` 
JAVA_HOME=`dirname $JAVA_HOME` 
export JAVA_HOME 

¿qué pasa con los peces?

set j (update-alternatives --query javac | grep Value:) 
set JAVA_HOME (dirname ${j#Value:}) <-- this won't work!! 
set JAVA_HOME (dirname $JAVA_HOME) 
set --export JAVA_HOME 
+0

renuncié manipulación de cadenas en favor del conjunto --export JAVA_HOME (update-alternatives --query javac | grep Valor: | sed -e "s/Valor: //" | sed 's ,/* [^ /] \ +/* $ ,, '| sed' s,/* [^ /] \ +/* $ ,, ') – lrkwz

Respuesta

2

Bash:

j=$(update-alternatives --query javac | sed -n '/Value: /s///p') 
export JAVA_HOME=${j%/*/*} 

pescado:

set j (update-alternatives --query javac | sed -n '/Value: /s///p') 
set --export JAVA_HOME (dirname (dirname $j)) 

o

set --export JAVA_HOME (dirname (dirname (update-alternatives --query javac | sed -n '/Value: /s///p'))) 
2

en lugar de sed, u podría hacer uso de expr con una expresión regular, por ejemplo:

$ set a /path/to/some/folder/file.extension 

el comando:

$ expr "//$a" : '.*/\([^.]*\)\..*$' 
file 

extraer el nombre base del archivo sin extensión.

Ver man expr

0

shell Fish:

~> set JAVA_HOME (readlink -f /usr/bin/javac | sed "s:/bin/javac::") 
~> echo $JAVA_HOME 

de salida (ejemplo):

/usr/lib/jvm/java-8-openjdk-amd64 

también u puede añadir a ~/.config/fish/config.fish esta línea:

set JAVA_HOME (readlink -f /usr/bin/javac | sed "s:/bin/javac::") 

WBR

11

La cáscara de pez ahora tiene un comando incorporado string para la manipulación de cadenas. Esto fue agregado en la versión 2.3.0 (mayo de 2016).

E.g. en este caso, podríamos utilizar string replace para eliminar el Value: subcadena:

set j (update-alternatives --query javac | grep Value: | string replace 'Value: ' '') 
set --export JAVA_HOME (dirname (dirname $j)) 

Hay mucho más que puede hacer string. Desde el string command documentation:

Synopsis 

string length [(-q | --quiet)] [STRING...] 
string sub [(-s | --start) START] [(-l | --length) LENGTH] [(-q | --quiet)] 
      [STRING...] 
string split [(-m | --max) MAX] [(-r | --right)] [(-q | --quiet)] SEP 
      [STRING...] 
string join [(-q | --quiet)] SEP [STRING...] 
string trim [(-l | --left)] [(-r | --right)] [(-c | --chars CHARS)] 
      [(-q | --quiet)] [STRING...] 
string escape [(-n | --no-quoted)] [STRING...] 
string match [(-a | --all)] [(-i | --ignore-case)] [(-r | --regex)] 
      [(-n | --index)] [(-q | --quiet)] [(-v | --invert)] PATTERN [STRING...] 
string replace [(-a | --all)] [(-i | --ignore-case)] [(-r | --regex)] 
       [(-q | --quiet)] PATTERN REPLACEMENT [STRING...] 
+0

¡Guau! ¡Genial! Si quiero usar los resultados de algo como 'string split '' '' 'Esta es mi cadena de pruebas' 'en una variable de lista, ¿cómo lo haría? – rassoh

+1

@rassoh - A modo de ejemplo: 'set mylist (string split" "" This is my teststring ")' – mattbh

+0

gracias, ¡funciona genial! Por supuesto, para hacer una lista que tenía que hacer 'set -l mylist (...)' – rassoh

Cuestiones relacionadas