it-swarm.com.de

Grep-Linien nach dem Spiel bis zum Ende

Ich habe folgende Ausgabe von git status, wie mache ich grep für alles nach Untracked files:

[[email protected] 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
[[email protected] Test]$ 

So, aber ohne Angabe der Anzahl der Zeilen, wie das -A Parameter in GNU grep:

[[email protected] 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
[[email protected] Test]$ 

Gibt es eine Möglichkeit, dies zu tun?

[[email protected] 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>.
[[email protected] Test]$ 
12
alexus

Mit GNU grep (getestet mit Version 2.6.3):

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

Verwendet -P Für reguläre Perl-Ausdrücke, -z, Um auch Zeilenumbrüche mit \n Und -o Abzugleichen, um nur das zu drucken, was dem Muster entspricht.

Der reguläre Ausdruck erklärt:

Zuerst stimmen wir jedes Zeichen (.) Null oder mehrmals (*) Ab, bis die Zeichenfolge Untracked files Vorkommt. Jetzt stimmt der Teil in den Klammern (.*\n) Mit jedem Zeichen überein, mit Ausnahme einer neuen Zeile (.) Null oder mehrmals (*), Gefolgt von einer neuen Zeile (\n). ). Und all das (das ist in den Backets) kann null oder mehrmals vorkommen; das ist die Bedeutung des letzten *. Es sollte jetzt nach dem ersten Auftreten von Untracked files Mit allen anderen Zeilen übereinstimmen.

17
chaos

Wenn es Ihnen nichts ausmacht, sed zu verwenden, finden Sie hier eine mögliche Lösung

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

Ich würde awk dafür verwenden:

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

Diese /Untracked files/,0 ist eine Bereichsausdruck. Es wird vom ersten Mal an True ausgewertet Untracked files und bis 0 ergibt True. Da dies nie passiert, wird der Rest der Datei gedruckt.

Beachten Sie, dass das Verhalten von awk zu einem True darin besteht, den aktuellen Datensatz (normalerweise Zeile) zu drucken. Deshalb müssen wir print nicht explizit aufrufen.

3
fedorqui

Sie können versuchen:

git status | grep -A99 Untracked

dabei würde -A nach dem Match Zeilen mit nachfolgendem Kontext drucken.

Alternativ können Sie more oder less verwenden, zum Beispiel:

git status | less +/Untracked

Für Skriptzwecke würde ich ex/vi verwenden:

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

Verwenden Sie kd1G Anstelle von d1G, Um eine Zeile mit nicht verfolgte Dateien einzuschließen.

Oder ohne Piping und /dev/stdin Wäre die Syntax: ex ... <(git status).

2
kenorb

Damit ein Einzeiler mit Klammern eine Unterschale erzeugt, vermeiden Sie, dass die Variablen beibehalten werden:

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

Sie können am Ende einfach in alles einpfeifen, was Sie sonst noch damit tun müssen.

Oder Sie können es in jedem Shell-Skript verwenden

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

Ersetze das echo "$LINE" mit was auch immer Sie mit den Daten machen wollen. Wenn Sie die Zeile "Nicht verfolgte Dateien" überspringen möchten, wechseln Sie einfach die beiden Tests.

1
Hyppy

sie können so etwas verwenden, ich habe Perl verwendet, den folgenden Befehlssatz count = 1 Wenn ich mit einer Zeichenfolge in der aktuellen Zeile übereinstimme und die while-Schleife beendet ist, überprüfe ich die Zählvariablen und drucke den Zeilenbereich von der Übereinstimmung bis zur letzten Zeile

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