У меня есть следующий вывод 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]$
Вот так, но без указания количества строк, как -A
параметр в 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]$
Есть ли способ сделать это?
[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
источник
источник
-A
с достаточно большим числом в качестве аргумента?Ответы:
С GNU
grep
(протестировано с версией 2.6.3):Используется
-P
для регулярных выражений perl,-z
также для соответствия новой строки\n
и-o
для печати только того, что соответствует шаблону.Регулярное выражение объяснило :
Сначала мы сопоставляем любой символ (
.
) ноль или несколько раз (*
) до появления строкиUntracked files
. Теперь, часть в скобках(.*\n)
соответствует любому символу, кроме newline (.
) ноль или несколько раз (*
), за которым следует newline (\n
). И все это (внутри бэкетов) может происходить ноль или несколько раз; в этом смысл последнего*
. Теперь он должен соответствовать всем остальным строкам после первого появленияUntracked files
.источник
grep
, я впечатлен!grep
это не правильный инструмент. Но в противном случае этот вопрос (я думаю) для пользователя, чтобы увидеть только соответствующий вывод, который вы, очевидно, не имеете на 8000+ строк,grep
или нет.grep -A999999999 'Untracked files'
1000000 строк перед матчем и 1000000 строк после матча. Этот подход работал просто отлично. Такgrep
может сделать это. Проблема с вашим подходом заключается в том, что вы заставляете его выполнять одно сопоставление для всего файла, а не для отдельных строк.Если вы не возражаете против использования sed, вот возможное решение
источник
Я бы использовал
awk
для этого:Это
/Untracked files/,0
выражение диапазона. Он оценивается как True с первого разаUntracked files
и до тех пор, пока не0
оценивается как True. Так как этого никогда не происходит, он печатает остальную часть файла.Обратите внимание, что
awk
поведение True заключается в печати текущей записи (обычно строки), поэтому нам не нужно явно вызыватьprint
.источник
Вы можете попробовать:
где
-A
будет печатать строки конечного контекста после совпадения.В качестве альтернативы используйте
more
илиless
, например:Для сценариев я бы использовал
ex
/vi
:Чтобы включить строку с неотслеживаемыми файлами , используйте
kd1G
вместоd1G
.Или без трубопровода и
/dev/stdin
синтаксис будет выглядеть так :ex ... <(git status)
.источник
-A
в свой оригинальный вопрос, но мне нравитсяmore +/Untracked
часть вашего ответа.ex
которой эквивалентенvi -e
.more
/less
очень полезно)Для однострочного с круглыми скобками, чтобы порождать подоболочку, чтобы избежать сохранения переменных:
Вы можете просто передать в конце этого все, что вам нужно с этим делать.
Или вы можете использовать его в любом сценарии оболочки
Замените на
echo "$LINE"
то, что вы хотите сделать с данными. Если вы хотите пропустить строку «Untracked files», просто переключите два теста.источник
Вы можете использовать что-то вроде этого, я использовал Perl, следующий набор команд,
count = 1
если я сопоставляю некоторую строку в текущей строке, и когда цикл while завершается, я проверяю переменные count и печатаю диапазон строк, из которых совпадение происходит с последним линияисточник
perl -ne 'print if /Untracked files:/ .. 0'