variable regular online exprreg creator regex bash sed

regex - exprreg - regular expression creator online



Reemplazar una parte de una cadena con la expansión de una variable de shell (4)

Podemos simplificar aún más este proceso utilizando un separador diferente para la expresión sed : he usado # lugar de / :

path=''__HOME__/properties/common/file.properties'' sed "s#__HOME__#$HOME#" <<< "$path" # output => /Users/codeforester/properties/common/file.properties

Como la expresión sed está encerrada entre comillas dobles, expande $HOME y las barras en la expansión $HOME no alterarán la expresión sed porque estamos usando # como separador. Se puede elegir cualquier carácter como separador siempre que no ocurra en ninguna otra parte de la expresión.

Mi objetivo es reemplazar todas las cadenas "especiales" del archivo de texto y reemplazarlas con variables del sistema. Por ejemplo, como entrada sería una línea como esta:

__HOME__/properties/common/file.properties

Aquí la cadena especial es __HOME__ y debo reemplazarla con la variable $ HOME del sistema. Como salida debería ser:

/home/user/properties/common/file.properties

Estaba tratando de resolver este problema con el comando sed y llegué a este punto:

echo __HOME__/properties/common/file.properties | sed -e ''s//(__/)/([A-Z]*/)/(__/)//2/g''

Como resultado, obtengo HOME/properties/common/file.properties que es incorrecto. Estaba tratando de reemplazar la referencia de sed (aquí /2 ) con algo como echo /2 pero esto no va a funcionar. ¿Hay algo que se pueda hacer en Bash?


Podría usar perl

perl -lpe ''s/__(.+?)__/$ENV{$1}/g'' file

Solo comprueba las cadenas que tienen __something__ y las reemplaza con la variable de entorno de tu caparazón.


Puede usar eval para esto:

s=''__HOME__/properties/common/file.properties'' eval "printf ''%s/n'' "$(sed ''s/__/([A-Za-z_][a-zA-Z0-9_]*/)__/$/1/g'' <<< "$s")"" /home/user111/properties/common/file.properties


Podría usar Python

# coding=utf8 # the above tag defines encoding for this document and is for Python 2.x compatibility import re regex = r"(/_.*/_)" test_str = "__HOME__/properties/common/file.properties" subst = "/home/potato" # You can manually specify the number of replacements by changing the 4th argument result = re.sub(regex, subst, test_str, 0, re.MULTILINE) if result: print (result) # Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

Resultado:

/home/potato/properties/common/file.properties