事情是这样,最近在学习conan,发现一条命令,有点蒙,顺道温故一下shell命令
Makefile文件里的一条命令如下:
HEARD_SRCS = $(shell git ls-files | grep -E '\.h$$|\.cpp$$|\.hpp$$|\\.c$$' | tr '\n' ' ')
开始拆分:
1.git ls-files
git 命令,递归显示.git同级目录下的文件信息。
git ls-files [-z] [-t] [-v]
(--[cached|deleted|others|ignored|stage|unmerged|killed|modified])*
(-[c|d|o|i|s|u|k|m])*
[--eol]
[-x <pattern>|--exclude=<pattern>]
[-X <file>|--exclude-from=<file>]
[--exclude-per-directory=<file>]
[--exclude-standard]
[--error-unmatch] [--with-tree=<tree-ish>]
[--full-name] [--recurse-submodules]
[--abbrev] [--] [<file>…]
2.grep -e -v -E
可用于表达grep的 or and not操作。
grep的or操作有4种表达方式:
- grep 'pattern1\|pattern2' filename
- grep -E 'pattern1|pattern2' filename
- egrep 'pattern1|pattern2' filename
- grep -e pattern1 -e pattern2 filename
grep的and操作可以2种表达方式:
- grep命令本身不提供AND功能。但是,使用 -E 选项可以实现AND操作。grep -E 'pattern1.*pattern2' filename
- 可以使用多个 grep 命令 ,由管道符分割,以此来实现 AND 语义。 grep -E 'pattern1' filename | grep -E 'pattern2'
grep的not:
grep -v 'pattern1' filename
3. tr
删除文件中的控制字符以及进行字符转换操作.
4. '\.h'
\是shell的转义就是'.h'
5. $$
应该是正则表达式中的$,表示结尾匹配。其实写一个$就能满足。