ale*_*xus 15 command-line-interface grep
我有以下输出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]$
Run Code Online (Sandbox Code Playgroud)
像这样,但没有指定行数,就像-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]$
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
[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]$
Run Code Online (Sandbox Code Playgroud)
cha*_*aos 20
使用 GNU grep
(使用 2.6.3 版测试):
git status | grep -Pzo '.*Untracked files(.*\n)*'
Run Code Online (Sandbox Code Playgroud)
使用-P
Perl的正则表达式,-z
也匹配换行符与\n
和-o
仅打印什么模式相匹配。
正则表达式解释说:
首先我们匹配任何字符 ( .
) 零次或多次 ( *
) 直到出现字符串Untracked files
。现在,括号内的部分(.*\n)
匹配除换行符 ( .
) 零次或多次 ( *
) 后跟换行符 ( )之外的任何字符\n
。所有这些(在 backets 内)都可以发生零次或多次;这就是最后的意思*
。在第一次出现之后,它现在应该匹配所有其他行Untracked files
。
小智 14
如果您不介意使用 sed,这里有一个可能的解决方案
git status | sed -n -e '/Untracked files/,$p'
Run Code Online (Sandbox Code Playgroud)
我会用awk
这个:
git status | awk '/Untracked files/,0'
Run Code Online (Sandbox Code Playgroud)
这/Untracked files/,0
是一个范围表达式。它从第一次计算为 True Untracked files
,直到0
计算为 True。由于这从未发生过,它会打印文件的其余部分。
请注意,awk
True 的行为是打印当前记录(通常为行),这就是为什么我们不必显式调用print
.