Tengo el siguiente resultado de git status, ¿cómo hago greppara todo después 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]$
Así, pero sin especificar el número de líneas, como el -Aparámetro en 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]$
¿Hay una manera de hacerlo?
[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
fuente
fuente

-Aun número lo suficientemente grande como argumento?Respuestas:
Con GNU
grep(probado con la versión 2.6.3):Se utiliza
-Ppara expresiones regulares perl,-zpara coincidir también con la nueva línea\ne-oimprimir solo lo que coincide con el patrón.La expresión regular explicó :
Primero hacemos coincidir cualquier carácter (
.) cero o varias veces (*) hasta que ocurra la secuenciaUntracked files. Ahora, la parte dentro de los corchetes(.*\n)coincide con cualquier carácter, excepto una nueva línea (.) cero o varias veces (*) seguido de una nueva línea (\n). Y todo eso (que está dentro de los backets) puede ocurrir cero o varias veces; Ese es el significado de lo último*. Ahora debería coincidir con todas las demás líneas, después de la primera aparición deUntracked files.fuente
grep, ¡estoy impresionado!grepno es la herramienta correcta. Pero de lo contrario, esta pregunta es (creo) para que el usuario vea solo la salida relevante, lo que obviamente no tiene en más de 8000 líneas,greped o no.grep -A999999999 'Untracked files'con 1000000 líneas antes del partido y 1000000 líneas después del partido. Ese enfoque funcionó bien. Entoncesgreppuede hacerlo. El problema con su enfoque es que lo está obligando a realizar una sola coincidencia en todo el archivo en lugar de en líneas individuales.Si no te importa usar sed, aquí hay una posible solución
fuente
Yo usaría
awkpara esto:Esta
/Untracked files/,0es una expresión de rango. Se evalúa como verdadero desde la primera vezUntracked filesy hasta0evalúa como verdadero. Como esto nunca sucede, imprime el resto del archivo.Tenga en cuenta que
awkel comportamiento de un Verdadero es imprimir el registro actual (línea, normalmente), es por eso que no tenemos que llamar explícitamenteprint.fuente
Puedes probar:
donde
-Aimprimiría líneas de contexto final después del partido.Alternativamente, use
moreoless, por ejemplo:Para fines de secuencias de comandos, usaría
ex/vi:Para incluir una línea con archivos sin seguimiento , use en
kd1Glugar ded1G.O sin tubería y
/dev/stdin, la sintaxis sería:ex ... <(git status).fuente
-Aen mi pregunta original, pero me gustamore +/Untrackedparte de su respuesta.excual es equivalentevi -e.more/lesses muy útil)Para una línea con paréntesis para generar una subshell para evitar retener las variables:
Simplemente puede canalizar al final de eso en cualquier otra cosa que necesite hacer con él.
O puede usarlo en cualquier script de shell
Reemplace el
echo "$LINE"con lo que quiera hacer con los datos. Si desea omitir la línea "Archivos no rastreados", simplemente cambie las dos pruebas.fuente
puede usar algo como esto, usé Perl, el siguiente conjunto de comandos
count = 1si hago coincidir alguna cadena en la línea actual y cuando el ciclo while finaliza, verifico las variables de conteo e imprimo el rango de líneas desde el lugar donde coinciden hasta el último líneafuente
perl -ne 'print if /Untracked files:/ .. 0'