URI:
       # snippets shell
       
       ## Remplacer tout ce qui ne contient pas pattern
       
       ```
       sed "/pattern/! s/foo/bar/g" file
       ```
       
       ## Supprimer toutes les lignes après pattern
       
       ```
       sed -i '/pattern/,$d' text.txt
       ```
       
       ## Supprimer les lignes commentées et virer les vides
       
       ```
       grep -v "^#" fichier | sort -u
       ```
       
       ## Envoyer dans le néant le retour d'une commande
       
       ```
       $ macommande > /dev/null 2>&1
       ```
       
       ## Afficher les lignes de 1 à 3
       
       ```
       sed -n '1,3p' file
       ```
       
       ## Afficher tout sauf première et dernière ligne
       
       ```
       sed '1d;$d" fichier.txt
       ```
       
       ## Boucle sur une liste contenant des espaces
       
       ```
       sort file.txt | head | while read -r line
       do
           echo $line
       done
       ```
       
       ## Supprimer les dossiers vides
       
       ```
       find /path/to/dir -empty -type d -delete
       ```
       
       ## Afficher tout le contenu d'un fichier après un pattern
       
       ```
       awk 'f;/pattern/{f=1}' fichier.txt
       # or
       sed -n -e '/patern/,$p' fichier.Txt
       sed -n 's/^.*pattern*//p'
       ```
       
       ## Supprimer la dernière ligne d'un fichier:
       
       ```
       sed -i -e '$ d' fichier.txt
       ```
       
       ## Vérifier qu'un script ne tourne pas déjà
       
       ```
       while [ $(pgrep -f $0 | wc -l) -gt 1 ]; do
           kill -9 $(pgrep -o -f $0)
       done
       ```
       
       ## Voir les urls dans une page
       
       ```
       sed -n 's/.*href="\([^"]*\).*/\1/p' file
       ```
       
       ## Découper un fichier à partir de la ligne vide
       
  HTML https://stackoverflow.com/questions/1644532/how-to-split-file-on-first-empty-line-in-a-portable-way-in-shell-e-g-using-sed
       
       ## Exécuter une commande à la réception d'un signal
       
       ```
       trap "rm ${lock}" SIGINT SIGQUIT SIGABRT SIGTERM
       ```
       
       ## Décommenter une ligne spécifique
       
       ```
       sed -i /^#pattern/s/^#// fichier
       ```
       
       ## getopts : Gérer les options passées en argument (flags -a -b -c)
       
       On utilise getopts suivi des flags. Si une lettre est suivie de ":", alors le mot suivant est contenu dans $OPTARG.
       
       ```
       while getopts 'sd:' c
       do
           case $c in
               s) S=1 ;;
               d) D="${OPTARG}" ;;
           esac
       done
       # cette ligne permet d'avoir la suite des flags dans $1     
       shift $((OPTIND - 1))
       ```
       
       ## Un menu à choix multiples en shell avec select
       
       Pour obtenir un menu ressemblant à :
       
       ```
       1) Choix1
       2) Choix2
       3) Choix3
       #?
       ```
       
       on peut utiliser select, une fonction présente dans la plupart des shells. Afin de me simplifier la vie, j'en ai fait une fonction qui prend en argument une liste de choix. Par exemple, pour enregistrer dans une variable var le choix de l'utilisateur, on pourra écrire :
       
       ```
       var=$(selmenu "Choix1 Choix2 Choix3")
       ```
       
       Voici donc la fonction selmenu:
       
       ```
       selmenu() {
       ### show a menu from a list in $@ and return user choice
           ans=""
           select item in $@; do
               if [ $REPLY -gt 0 -a $REPLY -le $# ]; then
                   echo $item
                   break
               fi
           done
       }
       ```
       
       Si vous n'aimez pas le prompt #?, vous pouvez le définir avant d'appeler la fonction selmenu en modifiant la variable PS3:
       
       ```
       PS3="Faîtes un choix"
       var=$(selmenu Choix1 Choix2 Choix3)
       ```