我在一些C#代码中调用了一组存储过程(SP)。我只是想找到哪些C#文件使用这些SP的行。
我已经安装了git-bash,并且正在Win10环境中工作。
无论我尝试什么,grep都不会吐出任何内容,或者吐出每个具有匹配记录的文件的全部内容。我只想要文件名 和SP正则表达式匹配的行号。
在终端中,这就是我所做的:
procs=( $(cat procs.txt) ) #load the procs into an array
echo ${#procs[@]} #echo the size to make sure each proc got read in separately
output: 235
files=( $(find . -type f -iregex '.*\.cs') ) #load the file paths into an array,
#this similarly returns a filled out array
output: #over 1000
我也尝试过这个变体,删除路径中的初始'./',认为相对路径导致了问题
files=( $(find . -type f -iregex '.*\.cs' | sed 's/..//') )
其余的是一个简单的嵌套for循环:
for i in ${procs[@]}
do
for j in ${files[@]}
do
grep -nie "$i" "$j"
done
done
我已经尝试了这个基本思想的许多其他变体,比如将grep输出重定向到文本文件,添加和减去标志, 引用和取消引用变量等。
我也试过这种方法,但同样不成功
for i in ${procs[@]}
do
grep -r --include='*.cs' -F $i
#and i also tried
grep -F $i *
done
此时我觉得有一些我不明白git-bash如何在windows环境中运行的东西,因为它现在似乎已经有用了。
感谢您的帮助。
修改
因此,经过几个小时的痛苦,我终于得到了它的工作:
for i in "${!procs[@]}"
do
for j in "${!files[@]}"
do
egrep -nH $(echo "${procs[$i]}") $(echo "${files[$j]}")
done
done
我查了一下,我的git-bash版本是gnu-bash 4.4.12(1) x86_64-pc-msys
我仍然不确定为什么git-bash需要这样奇怪的引用和回声才能使一切正常运行。在debian linux上它只使用了一个简单的
for i in ${procs[@]}
do
for j in ${files[@]}
do
grep $i $j
done
done
运行此版本的bash:GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
如果有人能告诉我为什么git-bash行为如此奇怪,我仍然想知道答案。