web-dev-qa-db-fra.com

lignes de grep après le match jusqu'à la fin

J'ai la sortie suivante de git status, comment puis-je grep pour tout après Untracked files:

[alexus@wcmisdlin02 Test]$ git status 
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   app/.gitignore
#   new file:   app/app.iml
#   new file:   app/build.gradle
#   new file:   app/proguard-rules.pro
#   new file:   app/src/androidTest/Java/org/alexus/test/ApplicationTest.Java
#   new file:   app/src/main/AndroidManifest.xml
#   new file:   app/src/main/Java/org/alexus/test/MainActivity.Java
#   new file:   app/src/main/res/layout/activity_main.xml
#   new file:   app/src/main/res/menu/menu_main.xml
#   new file:   app/src/main/res/mipmap-hdpi/ic_launcher.png
#   new file:   app/src/main/res/mipmap-mdpi/ic_launcher.png
#   new file:   app/src/main/res/mipmap-xhdpi/ic_launcher.png
#   new file:   app/src/main/res/mipmap-xxhdpi/ic_launcher.png
#   new file:   app/src/main/res/values-w820dp/dimens.xml
#   new file:   app/src/main/res/values/dimens.xml
#   new file:   app/src/main/res/values/strings.xml
#   new file:   app/src/main/res/values/styles.xml
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   .gitignore
#   .idea/
#   Test.iml
#   build.gradle
#   gradle.properties
#   gradle/
#   gradlew
#   gradlew.bat
#   settings.gradle
[alexus@wcmisdlin02 Test]$ 

Comme ça, mais sans spécifier le nombre de lignes, comme le -A paramètre dans GNU grep:

[alexus@wcmisdlin02 Test]$ git status | grep -A100 'Untracked files'
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   .gitignore
#   .idea/
#   Test.iml
#   build.gradle
#   gradle.properties
#   gradle/
#   gradlew
#   gradlew.bat
#   settings.gradle
[alexus@wcmisdlin02 Test]$ 

Y a-t-il un moyen de le faire?

[alexus@wcmisdlin02 Test]$ grep --version
grep (GNU grep) 2.20
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
[alexus@wcmisdlin02 Test]$ 
12
alexus

Avec GNU grep (testé avec la version 2.6.3):

git status | grep -Pzo '.*Untracked files(.*\n)*'

Les usages -P pour les expressions régulières Perl, -z pour faire correspondre la nouvelle ligne avec \n et -o pour imprimer uniquement ce qui correspond au motif.

Le regex expliqué:

Nous faisons d'abord correspondre n'importe quel caractère (.) zéro ou plusieurs fois (*) jusqu'à ce qu'une occurrence de la chaîne Untracked files. Maintenant, la partie à l'intérieur des crochets (.*\n) correspond à n'importe quel caractère à l'exception d'une nouvelle ligne (.) zéro ou plusieurs fois (*) suivi d'une nouvelle ligne (\n). Et tout cela (qui est à l'intérieur des backets) peut se produire zéro ou plusieurs fois; c'est le sens du dernier *. Il devrait maintenant correspondre à toutes les autres lignes, après la première occurrence de Untracked files.

17
chaos

Si cela ne vous dérange pas d'utiliser sed, voici une solution possible

git status | sed -n -e '/Untracked files/,$p'
13
rahul

J'utiliserais awk pour cela:

git status | awk '/Untracked files/,0'

Cette /Untracked files/,0 est une expression de plage. Il prend la valeur True dès la première fois Untracked files et jusqu'à 0 est évalué à True. Comme cela ne se produit jamais, il imprime le reste du fichier.

Notez que le comportement de awk sur un True est d'imprimer l'enregistrement en cours (ligne, normalement), c'est pourquoi nous n'avons pas à appeler explicitement print.

3
fedorqui

Vous pouvez essayer:

git status | grep -A99 Untracked

-A afficherait des lignes de contexte de fin après la correspondance.

Vous pouvez également utiliser more ou less, par exemple:

git status | less +/Untracked

À des fins de script, j'utiliserais ex/vi:

git status | ex -s +"/Untracked/norm d1G" +%p -cq! /dev/stdin

Pour inclure la ligne avec fichiers non suivis, utilisez kd1G Au lieu de d1G.

Ou sans tuyauterie et /dev/stdin, La syntaxe serait: ex ... <(git status).

2
kenorb

Pour qu'une ligne unique avec des parenthèses génère un sous-shell afin d'éviter de conserver les variables:

(while read LINE ; do [[ "$LINE" =~ "Untracked files" ]] && MATCHED=1 ; \
   [[ "$MATCHED" = 1 ]] && echo "$LINE" ; done < <(git status))

Vous pouvez simplement diriger à la fin de tout ce que vous devez faire avec.

Ou vous pouvez l'utiliser dans n'importe quel script Shell

while read LINE ; do
    [[ "$LINE" =~ "Untracked files" ]] && MATCHED=1
    [[ "$MATCHED" = 1 ]] && echo "$LINE"
done < <(git status)

Remplace le echo "$LINE" avec tout ce que vous voulez faire avec les données. Si vous souhaitez ignorer la ligne "Fichiers non suivis", passez simplement les deux tests.

1
Hyppy

vous pouvez utiliser quelque chose comme ça, j'ai utilisé Perl, le jeu de commandes suivant count = 1 si je fais correspondre une chaîne dans la ligne actuelle et lorsque la boucle while est terminée, je vérifie les variables de comptage et j'imprime la plage de lignes à partir de laquelle la correspondance se produit jusqu'à la dernière ligne

ls -al | Perl -e '@LINES = (); $n = 0 ; $nline = 0; while(<>){ Push(@LINES, $_); $n++; if($_ =~ m/mirror/i) { $count = 1; $nline = $. - 1 };};  if($count != 0){ foreach $i($nline..$n-1){ print "\t$LINES[$i]\n";}}'
0
c4f4t0r