Tenho a seguinte saída de git status
, como faço grep
para tudo depois 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]$
Assim, mas sem especificar o número de linhas, como o -A
parâmetro no 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]$
Existe uma forma de fazer isso?
[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]$
command-line-interface
grep
alexus
fonte
fonte
-A
um número suficientemente grande como argumento?Respostas:
Com o GNU
grep
(testado com a versão 2.6.3):Utiliza
-P
expressões regulares perl,-z
também para combinar nova linha com\n
e-o
imprimir apenas o que corresponde ao padrão.O regex explicou :
Primeiro, combinamos qualquer caractere (
.
) zero ou várias vezes (*
) até uma ocorrência da stringUntracked files
. Agora, a parte dentro dos colchetes(.*\n)
corresponde a qualquer caractere, exceto uma nova linha (.
) zero ou várias vezes (*
) seguida por uma nova linha (\n
). E tudo isso (dentro dos backets) pode ocorrer zero ou várias vezes; esse é o significado do último*
. Agora deve corresponder a todas as outras linhas, após a primeira ocorrência deUntracked files
.fonte
grep
, estou impressionado!grep
não é a ferramenta certa. Mas, caso contrário, essa pergunta é (eu acho) para o usuário ver apenas a saída relevante, o que você obviamente não tem em mais de 8000 linhas, editadasgrep
ou não.grep -A999999999 'Untracked files'
com 1000000 linhas antes da partida e 1000000 linhas após a partida. Essa abordagem funcionou muito bem. Entãogrep
pode fazê-lo. O problema com sua abordagem é que você está forçando a executar uma única correspondência em todo o arquivo, e não em linhas individuais.Se você não se importa em usar o sed, aqui está uma solução possível
fonte
Eu usaria
awk
para isso:Esta
/Untracked files/,0
é uma exressão de intervalo. Ele avalia como True desde a primeira vezUntracked files
e até0
avalia como True. Como isso nunca acontece, ele imprime o restante do arquivo.Observe que
awk
o comportamento de um True é imprimir o registro atual (linha, normalmente), é por isso que não precisamos chamar explicitamenteprint
.fonte
Você pode tentar:
onde
-A
imprimiria linhas do contexto à direita após a partida.Como alternativa, use
more
ouless
, por exemplo:Para fins de script, eu usaria
ex
/vi
:Para incluir linha com arquivos não rastreados , use em
kd1G
vez ded1G
.Ou sem tubulação e
/dev/stdin
, a sintaxe seria:ex ... <(git status)
.fonte
-A
na minha pergunta original, mas gosto demore +/Untracked
parte da sua resposta.ex
equivalente àvi -e
.more
/less
é muito útil)Para uma linha única entre parênteses gerar um subshell, assim você evita manter as variáveis:
Você pode simplesmente inserir no final disso tudo o que precisar fazer.
Ou você pode usá-lo em qualquer script de shell
Substitua por o
echo "$LINE"
que você deseja fazer com os dados. Se você quiser pular a linha "Arquivos não rastreados", basta alternar os dois testes.fonte
você pode usar algo assim, usei Perl, o seguinte comando definido
count = 1
se eu corresponder a alguma string na linha atual e quando o loop while terminar, verifico as variáveis de contagem e imprimo o intervalo de linhas de onde a correspondência aconteceu até a última linhafonte
perl -ne 'print if /Untracked files:/ .. 0'