Quiero crear un comando de shell que ejecute comandos bash pero que también mute una matriz en un archivo Javascript. Por ejemplo, en el archivo groups.js :
module.exports = { groups: [ "a", "b", "c" ] } Quiero poder ejecutar un comando de shell que espere la entrada del usuario, por ejemplo, + / - , y luego agregará/eliminará grupos a esa matriz de grupos en el archivo groups.js y también ejecutará echo "New group added successfully" al final. es posible?
Ejemplo de ejecución de código:
./command.sh What would you like to do? (+ for add, - for remove): + What group do you want to add: d New groups: groups: [ "a", "b", "c", "d" ] Successfully added "d" to groups.js!Como se menciona en los comentarios, puede ser mucho más fácil si las personas pueden editar el archivo groups.js directamente; sin embargo, si se debe usar un script, este script bash puede ser un comienzo.
$ cat command.sh #!/usr/bin/env bash file=groups.js read -rp "What would you like to do? (+ for add, - for remove): " add_or_remove_group if [[ "$add_or_remove_group" == "+" ]]; then cat "$file" read -rp "What group do you want to add: " add_group clear sed -i "s/\"[az]\"$/&,\n \"$add_group\"/" "$file" cat "$file" echo "Successfully added \"$add_group\" to groups.js" else cat "$file" read -rp "What group do you want to remove: " remove_group clear tac "$file"| sed "/\[\|{\|}/ ! {/$remove_group/d}" | tac | sed '/,/{N;N;/}/{s/,//}}' | tee "$file" echo "Successfully removed \"$remove_group\" to groups.js" fi $ ./command.sh What would you like to do? (+ for add, - for remove): + module.exports = { groups: [ "a", "b", "c" ] } What group do you want to add: d module.exports = { groups: [ "a", "b", "c", "d" ] } Successfully added "d" to groups.js $ ./command.sh What would you like to do? (+ for add, - for remove): - module.exports = { groups: [ "a", "b", "c", "d" ] } What group do you want to remove: a module.exports = { groups: [ "b", "c", "d" ] } Successfully removed "a" to groups.js#!/usr/bin/bash Add_Group() { eval "$(echo "sed 'H;\$!d;x;/module.exports[^{]*{/,/^}/ s/\n/@@##/g;s/^[^:]*:^[\[]*\[//g;s/\(groups[^\[]*\[\)\([^\\\"]*\)\(.*\\\"\)\([^\]]*\)/\1\2\3,\2\\\"$group\\\"\4/g;s/\(^.*\\\"\)\(.*\)/\n\1\n\2/;h;s/.*\n//;s/^,//g;G;s/\(.*\n\)\(.*\n\)\(.*\)/\2\1/;s/\n//g;s/@@##/\n/g' $File -i")" } Remove_Group() { eval "$(echo "sed '/\\\"$group\\\"/d;H;\$!d;x;s/\n/@@##/g;s/\(^.*\\\"\)\(.*\)/\n\1\n\2/;h;s/.*\n//;s/^,//g;G;s/\(.*\n\)\(.*\n\)\(.*\)/\2\1/;s/\n//g;s/@@##/\n/g' $File -i")" } File=groups.js if [[ "$#" -gt 0 ]] then if [[ "$1" == "--add" ]] then for group in "${@:2}"; do Add_Group done echo "New Groups:" cat $File elif [[ "$1" == "--remove" ]]; then for group in "${@:2}"; do Remove_Group done echo "New Groups:" cat $File fi else echo 'What would you like to do? (+ for add, - for remove):' read function if [[ "$function" == "+" ]]; then cat $File read -p "Enter group names separated by 'space' that you want to add : " input for group in ${input[@]} do Add_Group done echo "New Groups:" cat $File elif [[ "$function" == "-" ]]; then cat $File read -p "Enter group names separated by 'space' that you want to remove : " input for group in ${input[@]} do Remove_Group done echo "New Groups:" cat $File fi fiEste script se puede utilizar:
Interactivamente: ./Script.sh
No interactivo:
./Script.sh --añadir grupo1 grupo2 grupo3 ..
./Script.sh --remove grupo1 grupo2 grupo3...
Nota: La complejidad del comando sed utilizado es retener la estructura y los espacios de sangría en el archivo sin restricciones en la expresión regular como en la otra respuesta. Por lo tanto, si groups.js contiene textos adicionales que no sean la plantilla que se muestra, funcionará
Breve explicación de los comandos sed:
Añadir grupo
Carga todo el archivo en el búfer --> Para el rango /module.exports[^{]*{/,/^}/ ---> Reemplace \n con @### para restaurar la estructura por fin ---> Agrega una coma al último grupo existente ---> Agrega un nuevo grupo ---> Reemplaza el @@## de nuevo a \n
Eliminar_grupo
--->Elimine la línea que contiene "grupo" ---> En caso de que el grupo eliminado sea el último existente, luego se elimina la coma en el último grupo después de la edición restaurando la estructura original