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