J'ai eu un tas de scripts bash dans un répertoire que j'ai "sauvegardé" en faisant $ tail -n +1 -- *.sh

La sortie de cette queue est quelque chose comme:

==> do_stuff.sh <==
#! /bin/bash
cd ~/my_dir
source ~/my_dir/bin/activate
python scripts/do_stuff.py


==> do_more_stuff.sh <==
#! /bin/bash
cd ~/my_dir
python scripts/do_more_stuff.py

Ce sont tous des scripts assez simples avec 2 à 10 lignes. Compte tenu de la sortie de ce tail, je veux recréer tous les fichiers ci-dessus avec le même contenu. Autrement dit, je recherche une commande qui peut ingérer le texte ci-dessus et créer do_stuff.sh et do_more_stuff.sh avec le contenu approprié.

C'est plus une tâche ponctuelle, donc je n'ai pas vraiment besoin de quelque chose de robuste et je crois qu'il n'y a pas de cas extrêmes étant donné que les fichiers sont simples (par exemple, aucun des fichiers ne contient réellement ==>).

J'ai commencé par essayer de trouver une expression régulière correspondante et cela ressemblera probablement à quelque chose comme ça (==>.*\.sh <==)(.*)(==>.*\.sh <==), mais je suis coincé dans le fait de le faire capturer le nom de fichier, le contenu et la sortie dans un fichier.

Des idées?

2
leonsas 25 déc. 2015 à 08:51

2 réponses

Meilleure réponse

Supposons que votre fichier de sauvegarde s'appelle backup.txt

perl -ne "if (/==> (\S+) <==/){open OUT,'>',$1;next}print OUT $_" backup.txt

La version ci-dessus est pour Windows

Version fixe sur * nix:

perl -ne 'if (/==> (\S+) <==/){open OUT,">",$1;next}print OUT $_' backup.txt
2
Boying 25 déc. 2015 à 11:52
#!/bin/bash

while read -r line; do
  if [[ $line =~ ^==\>[[:space:]](.*)[[:space:]]\<==$ ]]; then
    out="${BASH_REMATCH[1]}"
    continue
  fi
  printf "%s\n" "$line" >> "$out"
done < backup.txt

Inconvénient: ligne vierge supplémentaire à la fin de chaque fichier créé sauf le dernier.

1
Cyrus 25 déc. 2015 à 09:52