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.