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]$
command-line-interface
grep
alexus
la source
la source
-A
un nombre suffisant comme argument?Réponses:
Avec GNU
grep
(testé avec la version 2.6.3):Utilise
-P
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.L'expression régulière a expliqué :
D'abord, nous faisons correspondre n'importe quel caractère (
.
) zéro ou plusieurs fois (*
) jusqu'à l'apparition de la chaîneUntracked files
. Maintenant, la partie à l'intérieur des crochets(.*\n)
correspond à n'importe quel caractère à l'exception d'un newline (.
) zéro ou plusieurs fois (*
) suivi d'un newline (\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 deUntracked files
.la source
grep
, je suis impressionné!grep
n'est pas le bon outil. Mais sinon, cette question est (je pense) pour l'utilisateur de ne voir que la sortie pertinente, ce que vous n'avez évidemment pas à plus de 8000 lignes,grep
éd ou non.grep -A999999999 'Untracked files'
avec 1000000 lignes avant le match et 1000000 lignes après le match. Cette approche a très bien fonctionné.grep
Je peux donc le faire. Le problème avec votre approche est que vous la forcez à effectuer une seule correspondance sur l'ensemble du fichier plutôt que sur des lignes individuelles.Si cela ne vous dérange pas d'utiliser sed, voici une solution possible
la source
J'utiliserais
awk
pour cela:Il
/Untracked files/,0
s'agit d'une expression de gamme. Il évalue à True dès la première foisUntracked files
et jusqu'à ce qu'il soit0
évalué à True. Comme cela ne se produit jamais, il imprime le reste du fichier.Notez que
awk
le comportement d'un True est d'imprimer l'enregistrement en cours (ligne, normalement), c'est pourquoi nous n'avons pas à appeler explicitementprint
.la source
Vous pouvez essayer:
où
-A
imprimerait les lignes du contexte de fin après la correspondance.Vous pouvez également utiliser
more
ouless
, par exemple:À des fins de script, j'utiliserais
ex
/vi
:Pour inclure une ligne avec des fichiers non suivis , utilisez à la
kd1G
place ded1G
.Ou sans tuyauterie et
/dev/stdin
, la syntaxe serait:ex ... <(git status)
.la source
-A
dans ma question d'origine, mais j'aime unemore +/Untracked
partie de votre réponse.ex
qui est équivalente àvi -e
.more
/less
est très utile)Pour qu'une ligne unique avec des parenthèses génère un sous-shell afin d'éviter de conserver les variables:
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
Remplacez le
echo "$LINE"
par ce que vous voulez faire avec les données. Si vous souhaitez ignorer la ligne "Fichiers non suivis", passez simplement les deux tests.la source
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 lignela source
perl -ne 'print if /Untracked files:/ .. 0'