マッチ後の最後までの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]$ 

このように、ただし-AGNU のパラメーターのように、行数を指定せずに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十分な数の引数を引数として使用できないのですか?
カスペルド

回答:


17

GNU grep(バージョン2.6.3でテスト済み):

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

用途-PPerlの正規表現のために、-zまたして改行と一致するように\nして-o唯一のパターンに一致したものを印刷します。

正規表現の説明

最初に、文字列が出現するまで、任意の文字(.)を0回または複数回(*)一致させますUntracked files。現在、角かっこ内の部分は(.*\n)、改行(.)ゼロまたは複数回(*)に続いて改行()を除く任意の文字と一致します\n。そして、それはすべて(バケツの中にあります)ゼロまたは複数回発生する可能性があります。それが最後の意味です*。これで、が最初に出現した後、他のすべての行と一致するはずですUntracked files


3
実際に使用する答えはgrep、私は感銘を受けました!
-Hyppy

@hyppy me)そして、また、進化したPerl正規表現)
アレクサス

1
入力に多くの行がある場合、これはうまく機能しません。Ubuntu 14.04でテストし、約8000行より長い場合はセグメンテーション違反です。
カスペルド

2
@kasperd 8000行以上でgrepは、正しいツールではないと思います。しかし、それ以外の場合、この質問は、ユーザーが関連する出力のみを表示することだと思いますgrep
カオス

1
@chaosまたgrep -A999999999 'Untracked files'、試合前の1000000行と試合後の1000000行でテストしました。そのアプローチはうまくいきました。だからgrepできる。アプローチの問題は、個々の行ではなくファイル全体で1つの一致を強制的に実行することです。
カスペルド

13

sedを使用してもかまわない場合、考えられる解決策は次のとおりです。

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

これにはプレーンなUNIX grepおよびsedで動作するという利点がありますが、受け入れられたソリューションにはGNU grepが必要です。
Guntram Blohmはモニカをサポートします

3

私はawkこれに使用します:

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

これ/Untracked files/,0は範囲の拡張です。最初からTrue Untracked filesまで0評価され、True まで評価されます。これは決して起こらないので、ファイルの残りを印刷します。

awkTrueに対する動作は、現在のレコード(通常は行)を出力することであるため、明示的にを呼び出す必要がないことに注意してくださいprint


2

あなたが試すことができます:

git status | grep -A99 Untracked

where -Aは、一致後に末尾のコンテキストの行を出力します。

moreまたはless、たとえば、を使用します。

git status | less +/Untracked

スクリプトを作成するために、ex/を使用しますvi

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

追跡されていないファイルを含む行を含めるには、kd1G代わりにを使用しますd1G

または、パイプおよびを使用しない/dev/stdin場合、構文は次のようになりますex ... <(git status)


私は-A元の質問に含めましたが、more +/Untrackedあなたの答えの一部が好きです。
アレクサス

@alexusスクリプトを記述している場合、exと同等のバージョンを追加しましたvi -e
ケノーブ

ありがとう、私は信じていますmore/ less非常に便利です)
アレクサス

1

括弧付きの1ライナーでサブシェルを生成し、変数の保持を回避するには:

(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"データでやりたいことで置き換えます。「未追跡ファイル」の行をスキップする場合は、2つのテストを切り替えるだけです。


0

このようなものを使用できます。Perlを使用count = 1し、現在の行の文字列に一致する場合は次のコマンドセットを使用します。whileループが終了すると、カウント変数を確認し、最後に一致する行の範囲を出力しますライン

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.