Si quieres a prueba de balas , probablemente quieras algo un poco más portátil que las complicadas opciones anteriores. Me apegaría a las características de POSIXex y lo haría estúpidamente simple: simplemente elimine la línea si está allí (independientemente de cuántas veces esté allí), agréguela al final del archivo, luego guarde y salga:
ex -sc 'g/^export PATH=\~\/\.composer\/vendor\/bin:\$PATH$/d
$a
export PATH=~/.composer/vendor/bin:$PATH
.
x' ~/.bashrc
Anclé la expresión regular para mayor robustez, aunque creo que es casi imposible hacer coincidir accidentalmente esta expresión regular. (Anclado significa usar ^y, $por lo tanto, la expresión regular solo coincidirá si coincide con una línea completa ).
Tenga en cuenta que +cmdPOSIX no requiere la sintaxis ni la característica común de permitir múltiples -cargumentos.
Hay una multitud de otras formas simples de hacer esto. Por ejemplo, agregue la línea al final del archivo, luego ejecute las dos últimas líneas del archivo a través del filtro externo UNIX uniq:
ex -sc '$a
export PATH=~/.composer/vendor/bin:$PATH
.
$-,$!uniq
x' input
Esto es muy, muy limpio y simple, y también es totalmente compatible con POSIX. Utiliza la función de escapeex para el filtrado de texto externo y la utilidad de shell especificada por POSIXuniq
La conclusión es que exestá diseñada para la edición de archivos en el lugar y es, con mucho, la forma más portátil de lograrlo de una manera no interactiva. Es anterior incluso al original vi, en realidad, el nombre vies para "editor visual", y el editor no visual sobre el que se creó fue ex ).
Para una simplicidad aún mayor (y para reducirlo a una sola línea), use printfpara enviar los comandos a ex:
printf %s\\n '$a' 'export PATH=~/.composer/vendor/bin:$PATH' . '$-,$!uniq' x | ex input
grep -Fq 'export PATH=~/.composer/vendor/bin:$PATH' ~/.bashrc || ex ...(ocat, para el caso)?ex ~/.bashrc -c "if search('export PATH=\~\/.composer\/vendor\/bin:\$PATH')>0 | norm quit | endif | norm Aexport PATH=~/.composer/vendor/bin:$PATH"exportes un comando , por lo que el resto de la línea es una palabra de shell, NO una asignación. Por lo tanto, a diferencia de una asignación variable (que no usaexport), necesita comillas dobles o se romperá en espacios en blanco . Consulte también Cómo agregar correctamente una ruta a PATH .