2010-09-22 5 views
1

La fin du statut git ressemble à ceci:Shell UNIX: comment faire une queue pour une expression interrogeable?

# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
#  Classes/Default.png 
#  Classes/[email protected] 
... 

Puisque vous pourriez avoir un certain nombre de fichiers non suivis, je suis en train de la queue de la fin du fichier à « fichiers non suivis » et l'enregistrer dans un fichier temp, dépouiller les trois premières lignes et convertir les noms de fichiers en git ajouter Classes/...

Je n'arrive pas à trouver un bon moyen (autre que peut-être un langage différent) de faire une queue vers une expression interrogeable . Merci!

Répondre

0

Utilisez la commande tail:

tail -$(($(wc -l < file.txt) - $(grep -n "Untracked files" file.txt|cut -d: -f1) - 2)) file.txt 

Comment ça marche:
nombre total de lignes dans le fichier = wc -l < file.txt
numéro de ligne de "fichiers sans trace" = grep -n "Untracked files" file.txt|cut -d: -f1
Le -2 est d'enlever la partie supérieure lignes

commande complète avec git add:

tail -$(($(wc -l < file.txt) - $(grep -n "Untracked files" file.txt|cut -d: -f1) - 2)) file.txt | tr -d '#'| while read line; do echo git add $line; done 
0

pipe à:

perl -e 'my ($o, $p) = (0, shift); while(<>){print if $o or $o = /$p/}' "$MY_REGEX" 

$MY_REGEX est votre modèle. Dans votre cas, probablement '^\s{7}'.

2

Utilisez sed pour imprimer tout de « fichiers » sans trace à la fin:

git status | sed -n '/Untracked files:$/,$p' 

Il vous suffit d'analyser les noms de fichiers en supprimant le caractère #.

Vous pouvez également utiliser git status -s pour obtenir une plus courte, sortie plus facilement analysable:

~$ git status -s 
?? Classes/Default.png 
?? Classes/[email protected] 

Ceci est une bonne application de awk, qui vous permet de grep et extraire en même temps:

~$ git status -s | awk '/\?\?/{print $2}' 
Classes/Default.png 
Classes/[email protected] 

Autre possibilité: awk '{if ($1 == "??") print $2}'

Vous pouvez aussi, bien sûr, utiliser git add à la liste (et ajouter) untracked des dossiers.

0

Solution utilisant un script shell.

Commencez par lire le fichier dans une boucle while, comptez le nombre de lignes lues, cassez la boucle lorsque la ligne requise est trouvée. L'utilisation du nombre de lignes met fin au fichier, puis extrait les noms de fichiers à l'aide de awk.

i=0; 
l=`wc -l filename | awk '{print $1}'`; 

while read line; 
do i=`echo $i + 1 | bc`; 
if [[ $line == "# Untracked files:" ]]; 
then break; 
fi; 
done < "filename"; 

tail -`echo $l -$i -2 | bc` filename | awk -F "/" '{print $NF}' 

ici « nom de fichier » est le fichier que vous voulez traiter

+0

vous n'avez pas besoin de lire vous-même le fichier. Utilisez 'grep -n'. Vous n'avez pas non plus besoin de 'bc'. Vois ma réponse. – dogbane

+0

@fahd: Oui. Votre solution est plus simple. – athena

+0

Merci beaucoup pour votre aide à tous! Ça marche! –