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_runse 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_runo$new_runno 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
sedsolo no usará regex, ¿pero losed -Eharía?-ees especificar una expresiónsede , 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-Eque con algunas implementaciones, le dice a sed que use ERE en lugar de BRE.-Eque solo domine la expresión regular extendida, no la regular. Gracias por la explicación.sedimplementaciones 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).sedpor lo general, considera que el separador es el primer carácter después delscomando, 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-ino es unasedopción estándar .$en este comando? Como, voy a cambiar$xxxen su conjunto al valor de una variable$JAVA_HOME. Lo intentésed -i "s@\$xxx@$JAVA_HOME@" file, pero el error diceno previous regular expressionman bashda 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$PATHvariable . Elsedejecutable 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_runcomo 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
$d1estoy 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_runy$new_runya 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
$ano 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_runo$new_runcontiene espacios?