Mam następujące dane wyjściowe git status
, jak to zrobić grep
po wszystkim 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]$
Tak, ale bez określania liczby wierszy, jak -A
parametr w 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]$
Czy jest na to sposób?
[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
źródło
źródło
-A
wystarczająco dużej liczby jako argumentu?Odpowiedzi:
Z GNU
grep
(testowany z wersją 2.6.3):Używa
-P
wyrażeń regularnych perla,-z
aby również dopasować znak nowej linii\n
i-o
wydrukować tylko to, co pasuje do wzorca.Wyrażenie regularne wyjaśniło :
Najpierw dopasowujemy dowolny znak (
.
) zero lub wiele razy (*
) aż do wystąpienia ciąguUntracked files
. Teraz część w nawiasach(.*\n)
odpowiada dowolnemu znakowi oprócz znaku nowej linii (.
) zero lub wiele razy (*
), po którym następuje nowa linia (\n
). A wszystko to (to jest w tle) może wystąpić zero lub wiele razy; to jest znaczenie ostatniego*
. Powinien teraz pasować do wszystkich innych linii po pierwszym wystąpieniuUntracked files
.źródło
grep
Jestem pod wrażeniem odpowiedzi, która naprawdę się przydaje!grep
nie jest to właściwe narzędzie. Ale w przeciwnym razie to pytanie (wydaje mi się), aby użytkownik widział tylko odpowiednie wyjście, czego oczywiście nie masz na 8000+ linii,grep
ed lub nie.grep -A999999999 'Untracked files'
z 1000000 linii przed meczem i 1000000 linii po meczu. Takie podejście działało dobrze. Więcgrep
mogę to zrobić. Problem z twoim podejściem polega na tym, że zmuszasz go do wykonania pojedynczego dopasowania w całym pliku, a nie w poszczególnych liniach.Jeśli nie masz nic przeciwko użyciu sed, oto możliwe rozwiązanie
źródło
Użyłbym
awk
do tego:Jest
/Untracked files/,0
to wyjątek zasięgu. Ocenia się na Prawda od pierwszego razuUntracked files
i do czasu, aż0
dojdzie do Prawdy. Ponieważ tak się nigdy nie dzieje, drukuje resztę pliku.Zauważ, że
awk
zachowanie do wartości True polega na drukowaniu bieżącego rekordu (normalnie liniowego), dlatego nie musimy jawnie wywoływaćprint
.źródło
Możesz spróbować:
gdzie
-A
wypisuje linie kontekstu końcowego po dopasowaniu.Alternatywnie użyj
more
lubless
, na przykład:Do celów skryptowych użyłbym
ex
/vi
:Aby dołączyć linię do nieśledzonych plików , użyj
kd1G
zamiastd1G
.Lub bez Rurociągi i
/dev/stdin
składnia będzie:ex ... <(git status)
.źródło
-A
moje oryginalne pytanie, ale podoba mi sięmore +/Untracked
część twojej odpowiedzi.ex
którą jest on równoważnyvi -e
.more
/less
jest bardzo przydatna)Aby jedno-liniowy z nawiasami spawnował podpowłokę, aby uniknąć zachowywania zmiennych:
Na końcu możesz po prostu przeskoczyć do tego, co chcesz z tym zrobić.
Lub możesz użyć go w dowolnym skrypcie powłoki
Zamień na
echo "$LINE"
cokolwiek chcesz zrobić z danymi. Jeśli chcesz pominąć wiersz „Nie śledzone pliki”, po prostu przełącz dwa testy.źródło
możesz użyć czegoś takiego: użyłem Perla, następującego zestawu komend,
count = 1
jeśli dopasuję jakiś ciąg w bieżącej linii, a gdy pętla while zostanie zakończona, sprawdzam zmienne zliczania i wypisuję zakres linii, od których dopasowanie się stało do ostatniej liniaźródło
perl -ne 'print if /Untracked files:/ .. 0'