匹配后的 grep 行直到结束

匹配后的 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]$ 

像这样,但不指定行数,就像-AGNU 中的参数一样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]$ 

答案1

使用 GNU grep(使用 2.6.3 版本测试):

git status | grep -Pzo '.*Untracked files(.*\n)*'

用于-Pperl 正则表达式,-z也匹配换行符\n-o仅打印与模式匹配的内容。

正则表达式解释

首先,我们匹配任意字符 ( .) 零次或多次 ( *),直到出现字符串Untracked files。现在,括号内的部分(.*\n)匹配除换行符 ( .) 之外的任何字符零次或多次 ( *),后跟换行符 ( \n)。并且所有这些(括号内的内容)可以出现零次或多次;这就是最后一个 的含义*。现在它应该匹配第一次出现 之后的所有其他行Untracked files

答案2

如果你不介意使用 sed,这里有一个可能的解决方案

git status | sed -n -e '/Untracked files/,$p'

答案3

我会用awk这个:

git status | awk '/Untracked files/,0'

/Untracked files/,0是一个范围表达式。它从第一次开始计算结果为 True Untracked files,直到0计算结果为 True。由于这种情况从未发生,因此它会打印文件的其余部分。

请注意,awk对 True 的行为是打印当前记录(通常为行),这就是为什么我们不必明确调用print

答案4

对于带括号的单行代码来生成子shell,这样就避免保留变量:

(while read LINE ; do [[ "$LINE" =~ "Untracked files" ]] && MATCHED=1 ; \
   [[ "$MATCHED" = 1 ]] && echo "$LINE" ; done < <(git status))

您可以直接将其末尾的管道传输到您需要用它执行的任何其他操作中。

或者你可以在任何 shell 脚本中使用它

while read LINE ; do
    [[ "$LINE" =~ "Untracked files" ]] && MATCHED=1
    [[ "$MATCHED" = 1 ]] && echo "$LINE"
done < <(git status)

将 替换echo "$LINE"为您想要对数据执行的任何操作。如果您想跳过“未跟踪文件”行,则只需切换两个测试即可。

相关内容