Maçtan sonra sonuna kadar grep çizgileri


12

Aşağıdaki çıktı var git status, nasıl grepsonra her şey için nasıl 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]$ 

Bunun gibi, ancak GNU'daki -Aparametre gibi satır sayısını belirtmeden 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]$ 

Bunu yapmanın bir yolu var mı?

[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]$ 

Neden -Aargüman olarak yeterince büyük bir sayı ile kullanamıyorsunuz ?
kasperd

Yanıtlar:


17

GNU ile grep(2.6.3 sürümü ile test edilmiştir):

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

Kullanımları -PPerl düzenli ifadeler için, -zayrıca yeni satır maç için \nve -osadece kalıpla eşleşen neyi yazdırmak için.

Normal ifade açıkladı :

İlk önce herhangi bir karakteri ( .) *, dizenin oluşmasına kadar sıfır veya birden çok kez ( ) eşleştiririz Untracked files. Şimdi, köşeli ayraçların içindeki bölüm, (.*\n)yeni satır ( .) sıfır veya birden çok kez ( *) ve ardından yeni satır ( ) dışında herhangi bir karakterle eşleşir \n. Ve tüm bunlar (desteklerin içinde) sıfır veya birden çok kez ortaya çıkabilir; bu sonuncunun anlamı *. Şimdi, ilk oluşumundan sonra diğer tüm satırlarla eşleşmelidir Untracked files.


3
Aslında kullanan bir cevap, grepetkilendim!
Hyppy

@hyppy me) ve sonra tekrar, maç da gelişti Perl regex)
alexus

1
Girişin çok fazla satırı varsa bu iyi çalışmaz. Ubuntu 14.04'te test ettim ve maç yaklaşık 8000 satırdan uzunsa, segfaults.
kasperd

2
@kasperd Bence 8000+ satır, grepdoğru araç değil. Ama aksi takdirde bu soru (sanırım) kullanıcının sadece ilgili çıktıyı görmesi, açıkçası 8000+ satırda sahip olmadığınız, edip grepedemeyeceğiniz.
kaos

1
@chaos Ayrıca grep -A999999999 'Untracked files'maçtan önce 1000000 satır ve maçtan sonra 1000000 satır ile test yaptım . Bu yaklaşım işe yaradı. Böylece grepyapabiliriz. Yaklaşımınızdaki sorun, onu tek tek satırlar yerine tüm dosyada tek bir eşleşme yapmaya zorlamanızdır.
kasperd

13

Sed'i kullanmanın bir sakıncası yoksa, işte olası bir çözüm

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

Bunun avantajı, düz UNIX grep ve sed ile çalışması, kabul edilen çözüm GNU grep gerektirmesidir.
Guntram Blohm, Monica'yı

3

Bunun için kullanacağım awk:

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

Bu /Untracked files/,0bir aralık ifadesidir. İlk kez Doğru olarak doğruya Untracked fileskadar 0değerlendirir. Bu asla gerçekleşmediği için dosyanın geri kalanını yazdırır.

O Not awkBir True olarak 'davranışı bizim sahip olmadığımız neden en açıkça çağırmak için o, (normalde, çizgi) geçerli kaydı yazdırmaktır print.


2

Deneyebilirsiniz:

git status | grep -A99 Untracked

nerede -Amaçtan sonra bağlamı sondaki satırları ekrana getirir.

Alternatif olarak moreveya less, örneğin kullanın :

git status | less +/Untracked

Komut dosyası yazmak için ex/ vi:

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

İzlenmeyen dosyalar içeren bir satır eklemek için kd1Gyerine kullanın d1G.

Ya ve Boru olmadan /dev/stdin, sözdizimi olacaktır: ex ... <(git status).


-AOrijinal soruma dahil ettim, ama more +/Untrackedcevabınızın bir kısmını beğendim .
alexus

@alexus Bir komut dosyası yazıyorsanız ex, eşdeğer bir sürüm ekledim vi -e.
kenorb

teşekkür ederim, inanıyorum more/ lessçok yararlı)
alexus

1

Değişkenleri korumaktan kaçınmak için parantezli bir astarın alt kabuk üretmesi için:

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

Bunun sonunda, onunla ne yapmanız gerekiyorsa onu borulayabilirsiniz.

Veya herhangi bir kabuk komut dosyasında kullanabilirsiniz

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

echo "$LINE"Verileri yapmak istediğiniz şeyle değiştirin . "İzlenmeyen dosyalar" satırını atlamak istiyorsanız, iki testi değiştirin.


0

böyle bir şey kullanabilirsiniz count = 1, geçerli satırdaki bir dizeyle eşleşirsem Perl, aşağıdaki komut setini kullandım ve while döngüsü bittiğinde sayım değişkenlerini kontrol ediyorum ve eşleşmenin sonuncu olduğu yerden satır aralığını yazdırıyorum hat

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";}}'

1
Çok karmaşık. Basit bir Perl çözümü burada: stackoverflow.com/a/18167194/111036 . perl -ne 'print if /Untracked files:/ .. 0'
Eşleşecek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.