บรรทัด grep หลังจากการแข่งขันจนถึงจุดสิ้นสุด


12

ฉันมีผลลัพธ์ต่อไปนี้จากgit statusฉันจะทำgrepทุกสิ่งหลังจาก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]$ 

เช่นนี้ แต่ไม่มีการระบุจำนวนบรรทัดเช่น-Aพารามิเตอร์ใน 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]$ 

มีวิธีทำหรือไม่?

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

ทำไมคุณไม่สามารถใช้-Aกับอาร์กิวเมนต์จำนวนมากพอ?
kasperd

คำตอบ:


17

ด้วย GNU grep(ทดสอบกับรุ่น 2.6.3):

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

ใช้-Pสำหรับนิพจน์ทั่วไปของ Perl -zเพื่อจับคู่บรรทัดใหม่ด้วย\nและ-oเพื่อพิมพ์เฉพาะสิ่งที่ตรงกับรูปแบบ

Regex อธิบายว่า :

ครั้งแรกที่เราให้ตรงกับตัวอักษรใด ๆ ( .) ศูนย์หรือหลายครั้ง ( *) Untracked filesจนกระทั่งเกิดขึ้นของสตริงที่ ตอนนี้ส่วนในวงเล็บจะ(.*\n)จับคู่กับอักขระใด ๆ ยกเว้น newline ( .) ศูนย์หรือหลายครั้ง ( *) ตามด้วย newline ( \n) และทั้งหมดนั้น (ที่อยู่ภายใน backets) สามารถเกิดขึ้นเป็นศูนย์หรือหลาย ๆ ครั้ง; *นั่นคือความหมายของสุดท้าย ตอนนี้มันควรจะตรงกับสายอื่น ๆ Untracked filesทั้งหมดหลังจากที่เกิดขึ้นครั้งแรก


3
คำตอบที่ใช้จริงgrepฉันประทับใจ!
Hyppy

@hyppy ฉันด้วย) และจากนั้นอีกครั้งจับคู่ยังพัฒนา Perl regex)
alexus

1
วิธีนี้ใช้ไม่ได้ผลหากอินพุตมีหลายบรรทัด ฉันทดสอบบน Ubuntu 14.04 และถ้าการแข่งขันมีความยาวมากกว่า 8000 บรรทัดมันจะแยกออก
kasperd

2
@kasperd ฉันคิดว่ามีมากกว่า 8000 บรรทัดgrepไม่ใช่เครื่องมือที่เหมาะสม แต่มิฉะนั้นคำถามนี้คือ (ฉันคิดว่า) สำหรับผู้ใช้ที่จะเห็นเฉพาะการส่งออกที่เกี่ยวข้องสิ่งที่คุณเห็นได้ชัดว่าไม่มีที่ 8000+ บรรทัดgrepหรือไม่
ความโกลาหล

1
@chaos ฉันทดสอบgrep -A999999999 'Untracked files'ด้วย 1000000 บรรทัดก่อนการแข่งขันและ 1000000 บรรทัดหลังการแข่งขัน วิธีการนั้นใช้ได้ผลดี ดังนั้นgrepสามารถทำได้ ปัญหาเกี่ยวกับวิธีการของคุณคือคุณกำลังบังคับให้ทำการจับคู่ครั้งเดียวในไฟล์ทั้งหมดแทนที่จะเป็นแต่ละบรรทัด
kasperd

13

หากคุณไม่รังเกียจการใช้ sed นี่เป็นวิธีแก้ปัญหาที่เป็นไปได้

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

สิ่งนี้มีความได้เปรียบที่ใช้งานได้กับ grep และ sed แบบ UNIX ธรรมดาในขณะที่โซลูชันที่ยอมรับนั้นต้องการ GNU grep
Guntram Blohm สนับสนุนโมนิกา

3

ฉันจะใช้awkสำหรับสิ่งนี้:

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

นี่/Untracked files/,0คือการบีบอัดช่วง มันประเมินค่าเป็น True ตั้งแต่ครั้งแรกUntracked filesจนถึงจนกว่าจะ0ประเมินเป็น True ตั้งแต่นี้ไม่เคยเกิดขึ้นมันพิมพ์ส่วนที่เหลือของไฟล์

โปรดทราบว่าawkพฤติกรรมการทรูคือการพิมพ์ระเบียนปัจจุบัน (สายปกติ) printนั่นเป็นเหตุผลที่เราจะได้ไม่ต้องโทรอย่างชัดเจน


2

คุณอาจลอง:

git status | grep -A99 Untracked

ที่-Aจะพิมพ์บรรทัดจากบริบทต่อท้ายหลังการแข่งขัน

ใช้อีกทางเลือกหนึ่งmoreหรือlessตัวอย่างเช่น:

git status | less +/Untracked

เพื่อวัตถุประสงค์ในการเขียนสคริปต์ฉันจะใช้ex/ vi:

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

จะรวมถึงสอดคล้องกับไฟล์ที่ไม่ได้ติดตามใช้แทนkd1Gd1G

หรือไม่มีท่อและไวยากรณ์จะเป็น:/dev/stdinex ... <(git status)


ฉันรวมอยู่-Aในคำถามเดิมแล้ว แต่ฉันชอบmore +/Untrackedคำตอบของคุณ
alexus

@alexus หากคุณกำลังเขียนสคริปต์ฉันได้เพิ่มเวอร์ชันexที่เทียบเท่าvi -eแล้ว
kenorb

ขอบคุณผมเชื่อmore/ lessเป็นประโยชน์อย่างมาก)
Alexus

1

สำหรับหนึ่งซับกับวงเล็บเพื่อวางไข่ subshell ดังนั้นคุณจึงหลีกเลี่ยงการเก็บตัวแปร:

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

คุณสามารถทำสิ่งที่คุณต้องทำกับมันได้

หรือคุณสามารถใช้มันในทุกเชลล์สคริปต์

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

แทนที่echo "$LINE"ด้วยสิ่งที่คุณต้องการจะทำกับข้อมูล หากคุณต้องการข้ามบรรทัด "ไฟล์ที่ไม่ได้ติดตาม" ให้เปลี่ยนการทดสอบสองรายการ


0

คุณสามารถใช้บางอย่างเช่นนี้ฉันใช้ Perl ชุดคำสั่งต่อไปนี้count = 1ถ้าฉันจับคู่สตริงในบรรทัดปัจจุบันและเมื่อขณะที่ลูปเสร็จสิ้นฉันจะตรวจสอบตัวแปรนับและฉันพิมพ์ช่วงของบรรทัดจากตำแหน่งที่ตรงกับสุดท้าย ไลน์

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
ซับซ้อนเกินไป วิธีการแก้ปัญหา Perl ง่ายๆคือที่นี่: stackoverflow.com/a/18167194/111036 รูปแบบที่มีบรรทัดที่ตรงกันอาจเป็น:perl -ne 'print if /Untracked files:/ .. 0'
mivk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.