Quiero hacer:
cat update_via_sed.sh | sed 's/old_name/new_name/' > new_update_via_sed.sh
en mi programa
Pero quiero usar variables, por ejemplo
old_run='old_name_952'
new_run='old_name_953'
He intentado usarlos pero la sustitución no ocurre (sin error). Yo he tratado:
cat update_via_sed.sh | sed 's/old_run/new_run/'
cat update_via_sed.sh | sed 's/$old_run/$new_run/'
cat update_via_sed.sh | sed 's/${old_run}/${new_run}/'
Respuestas:
Podrías hacerlo:
Pero tenga en cuenta que
$old_run
se tomaría como una expresión regular y, por lo tanto, cualquier carácter especial que contenga la variable, como/
o.
tendría que ser escapado . Del mismo modo, en$new_run
, los caracteres&
y\
tendrían que ser tratados especialmente y tendrías que escapar de los/
caracteres de nueva línea.Si el contenido de
$old_run
o$new_run
no está bajo su control, entonces es crítico realizar ese escape, o de lo contrario ese código equivale a una vulnerabilidad de inyección de código .fuente
sed
solo no usará regex, ¿pero losed -E
haría?-e
es especificar una expresiónsed
e , para que pueda pasar más de uno (como ensed -e exp1 -e exp2
) o combinaciones de archivos y expresiones (sed -f file -e exp
). Puede ser confuso-E
que con algunas implementaciones, le dice a sed que use ERE en lugar de BRE.-E
que solo domine la expresión regular extendida, no la regular. Gracias por la explicación.sed
implementaciones para sintaxis de expresiones regulares aún más.Esto funcionó:
Como quiero 'reutilizar' el mismo archivo, en realidad lo uso para cualquiera que desee un enfoque similar:
Lo anterior creó un nuevo archivo y luego elimina el archivo actual que cambia el nombre del nuevo archivo para que sea el archivo actual.
fuente
sed -i s/"$old"/"$new"/ update_via_sed.sh
. Sin embargo, tenga en cuenta que esto no funciona para ningún valor de lo antiguo y lo nuevo. por ejemplo, no debe contener / etc., ya que $ old sigue siendo una búsqueda y $ new un patrón de reemplazo donde algunos caracteres tienen significados especiales.sed -i "s/$old/$new/"
está bien también (con las precauciones anteriores).sed
por lo general, considera que el separador es el primer carácter después dels
comando, es decir, si sus variables contienen barras diagonales,/
pero no digamos en (@
), puede usar "s @ $ old @ $ new @".Puede usar variables en sed siempre que esté entre comillas dobles (no entre comillas simples):
Si tiene una barra diagonal (
/
) en la variable, use un separador diferente como se muestra a continuaciónfuente
|
como en mi caso, las variables contienen una ruta por lo que tiene/
en él|
funcionó para mí en MacOS 10.14, pero a otros separadores les gusta@
o#
no. También tenía cortes en mi env var.'in-place' sed (usando la bandera -i) fue la respuesta. Gracias a Peter.
fuente
s@
(que no es especial para el shell de ninguna manera). Lo mejor es poner todo dentro de comillas comosed -i "s@$old@$new@" file
. Tenga en cuenta que-i
no es unased
opción estándar .$
en este comando? Como, voy a cambiar$xxx
en su conjunto al valor de una variable$JAVA_HOME
. Lo intentésed -i "s@\$xxx@$JAVA_HOME@" file
, pero el error diceno previous regular expression
man bash
da esto sobre citas simplesIndependientemente de lo que escriba en la línea de comando, bash lo interpreta y luego envía el resultado al programa al que se supone que debe enviarse. En este caso, si usa
sed 's/$old_run/$new_run/'
, bash primero ve elsed
, lo reconoce como un presente ejecutable en$PATH
variable . Elsed
ejecutable requiere una entrada. Bash busca la entrada y encuentra's/$old_run/$new_run/'
. Las comillas simples dicen bash para no interpretar el contenido en ellas y pasarlas como están. Entonces, bash luego los pasa a sed. Sed da un error porque$
solo puede ocurrir al final de la línea.En cambio, si usamos comillas dobles, es decir,
"s/$old_run/$new_run/"
bash lo ve e interpreta$old_run
como un nombre de variable y realiza una sustitución (esta fase se llama expansión de variable). Esto es de hecho lo que requerimos.Pero, debes tener cuidado al usar comillas dobles porque, primero se interpretan con bash y luego se dan a sed. Por lo tanto, algunos símbolos como `deben escaparse antes de usarlos.
fuente
En riesgo de ser impertinente, ¿lo ha considerado
perl
?Lo cual, entre otras cosas, es bastante bueno para realizar operaciones de 'estilo sed', pero también es un programa de programación más completo.
Se ve como en su ejemplo, lo que está realmente tratando de hacer es incrementar un número.
Entonces, ¿qué tal:
o como una línea - estilo sed:
fuente
En
$d1
estoy almacenando valoresNo puedo reemplazar el valor de la variable, así que probé el siguiente comando que funciona
faltan comillas dobles
"${d1}"
, ese fue el errorfuente
Asumido
$old_run
y$new_run
ya está configurado:Esto muestra el cambio en la pantalla. Puede redirigir la salida al archivo si es necesario.
fuente
Para usar una variable en sed, use comillas dobles "", para encerrar la variable, en el patrón que está usando. Por ejemplo: a = "Hola" Si desea agregar la variable 'a' a un patrón, puede usar lo siguiente: sed -n "1, / patrón" $ {a} "patrón / p" nombre de archivo
fuente
$a
no se cita aquí, lo que significa que cualquier espacio en su valor invocará la división de palabras en el shell.También puedes usar Perl:
fuente
""
) no harán nada.romper la cuerda
malo => Linux ve una cadena $ old_run:
bueno => Linux ve una variable $ old_run:
fuente
$old_run
o$new_run
contiene espacios?