web-dev-qa-db-ja.com

マッチ後の最後までのgrep行

git statusからの出力は次のとおりです。Untracked files以降のすべてに対してgrepを実行するにはどうすればよいですか。

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

このように、ただし行数を指定せずに、GNU grep-Aパラメータのように:

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

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

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

Perl正規表現の場合は-Pを使用し、-zは改行を\nおよび-oと照合してパターンに一致するもののみを出力します。

正規表現の説明

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

17
chaos

Sedを使用してもかまわない場合は、次の解決策が考えられます

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

これにはawkを使用します。

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

これは/Untracked files/,0が範囲式です。最初のUntracked filesから0がTrueに評価されるまでTrueと評価されます。これは決して発生しないため、ファイルの残りの部分を印刷します。

Trueに対するawkの動作は現在のレコード(通常は行)を印刷することであることに注意してください。そのため、printを明示的に呼び出す必要はありません。

3
fedorqui

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

_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
_

追跡されていないファイルを含む行を含めるには、_kd1G_ではなく_d1G_を使用します。

または、パイピングと_/dev/stdin_がない場合、構文はex ... <(git status)になります。

2
kenorb

かっこ付きのワンライナーでサブシェルを生成して変数を保持しないようにする場合:

(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つのテストを切り替えるだけです。

1
Hyppy

あなたはこのようなものを使うことができます、私は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";}}'
0
c4f4t0r