我需要从上面的输出中解析出第二列-问题是,如果文件名包含空格并且用引号引起来。
命令:
$ git status -u -s
输出:
D README.md
D mail/falover.sh
?? "ahh/Nov nnsdfd file.txt"
?? fremover.sh
?? mail/ahooooj
?? mail/awww
?? mail/file_test
?? mail/git.sh
?? mail/test
非常感谢!
答案 0 :(得分:1)
如果您只需要具有"
的行,并且您需要第二个字段表示从"
到"
的值,那么下面的内容可能会对您有所帮助。
your_command | awk 'match($0,/".*"/){print substr($0,RSTART+1,RLENGTH-2)}'
如果您想在输出中有"
且所有其他行(其中没有"
的情况下打印文件名),那么以下内容可能会对您有所帮助。
your_command | awk 'match($0,/".*"/){print substr($0,RSTART+1,RLENGTH-2);next} 1'
答案 1 :(得分:1)
尝试使用-porcelain=2
选项,该选项将删除双引号,以便以后您可以使用类似的代码:
$ git status --porcelain=2 | cut -d" " -f9-
请注意,如果要获取所有文件(包括未跟踪的文件)也要加引号,则此操作将仅返回跟踪的文件;
$ git status --porcelain | cut -c4-
可以使用awk
:
$ git status --porcelain | awk '{$1 = ""; print substr($0, 2)}'
它的工作原理是将第一列设置为""
,然后打印整行$0
,但使用substr
删除用作定界符的空间。 (这将迫使awk
使用空格作为新的定界符来重建整个记录$0
-请在评论中查看@Ed Morton的解释,并https://stackoverflow.com/a/15475578/1135424)
答案 2 :(得分:1)
取决于是否要保留引号:
$ sed -E 's/^ *[^ ]+ +//' file
README.md
mail/falover.sh
"ahh/Nov nnsdfd file.txt"
fremover.sh
mail/ahooooj
mail/awww
mail/file_test
mail/git.sh
mail/test
$ sed -E 's/^ *[^ ]+ +//; s/^"|"$//g' file
README.md
mail/falover.sh
ahh/Nov nnsdfd file.txt
fremover.sh
mail/ahooooj
mail/awww
mail/file_test
mail/git.sh
mail/test
如果您的sed通过-E
不支持ERE,则:
$ sed 's/^ *[^ ]* *//; s/^"|"$//g' file
$ sed 's/^ *[^ ]* *//; s/^"//; s/"$//' file
请注意,在某些极端情况下,该操作将失败,即您的文件名以引号引起来(以UNIX文件名允许)。如果可能发生,请在您的问题中告诉我们,并将其包含在示例输入/输出中。
答案 3 :(得分:1)
不必git status
计算状态,然后从输出中抓取状态,而是使用git ls-files -o
或git ls-files -o --exclude-standard
简单地直接列出您想要的文件。
答案 4 :(得分:0)
如果您实际上不需要使用awk
,那么简单的cut
就足够了:
git status -u -s | cut -d" " -f2-
-d" "
设置空格作为定界符,-f2-
选择除第一个字段外的每个字段
答案 5 :(得分:0)
git status -u -s | awk -F '/' '{gsub("\"","");print $NF}'
如果我正确理解了问题