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]$
GNU grep
(バージョン2.6.3でテスト済み):
git status | grep -Pzo '.*Untracked files(.*\n)*'
Perl正規表現の場合は-P
を使用し、-z
は改行を\n
および-o
と照合してパターンに一致するもののみを出力します。
正規表現の説明:
最初に、文字列.
が出現するまで、任意の文字(*
)を0回または複数回(Untracked files
)照合します。現在、角かっこ(.*\n)
内の部分は、改行(.
)をゼロまたは複数回(*
)後に改行(\n
)を続けた文字以外のすべての文字に一致します。そして、そのすべて(それはバケツの中にあります)は、ゼロ回または複数回発生する可能性があります。それが最後の*
の意味です。 Untracked files
が最初に出現した後は、他のすべての行と一致するはずです。
Sedを使用してもかまわない場合は、次の解決策が考えられます
git status | sed -n -e '/Untracked files/,$p'
これにはawk
を使用します。
git status | awk '/Untracked files/,0'
これは/Untracked files/,0
が範囲式です。最初のUntracked files
から0
がTrueに評価されるまでTrueと評価されます。これは決して発生しないため、ファイルの残りの部分を印刷します。
Trueに対するawk
の動作は現在のレコード(通常は行)を印刷することであることに注意してください。そのため、print
を明示的に呼び出す必要はありません。
あなたは試すことができます:
_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)
になります。
かっこ付きのワンライナーでサブシェルを生成して変数を保持しないようにする場合:
(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つのテストを切り替えるだけです。
あなたはこのようなものを使うことができます、私は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";}}'