我想从项目的整个目录中检索服务名称。
所有服务呼叫均以特定模式开始:
getService().serviceName1()
getService().service2()
getService().
thirdSName()
注意上面的最后一场比赛是如何折叠成两行的;第一行与模式匹配,但服务名称包装在下一行。
我的解决方案:
grep -r "getService" *
预期报告:
serviceName1
service2
thirdSName
但是我的grep
结果不完整,因为它们不包含最后的服务名称。
答案 0 :(得分:0)
grep
无法轻松地选择匹配显示多行时显示多少?只能在比赛之前或之后指定固定数量的上下文行。
如果您需要步行,可以尝试使用以下简单的Awk脚本。
find . -type f -exec awk '/getService/ || more {
print FILENAME ":" NR ":" $0; more = ($0 ~ /\.[ \t]*$/) }' {} +
这只是检查最后一个非空白字符是否为点,如果是,则还选择以下行进行打印。
如果您的要求不太适中,则可以采用这些文件中使用的编程语言解析器。如果您的需求仅略微适中,则可以将Awk方法扩展得更多。
(find
包装器是因为Awk没有用于遍历目录树的-r
选项。)
答案 1 :(得分:0)
以下是结合了python脚本的find命令:
#!/usr/bin/env bash
pyscript="$(cat <<'EOF'
import re,sys
print(
*re.findall( # Find all the occurrences
r'(?:getService\(\)\.\s*)(\w+)', # regex with non-capturing group
open(sys.argv[1]).read(), # Open and read whole file
re.DOTALL), # Make the '.' special character match any character at all
sep="\n" # print with element on its own line.
)
EOF
)"
find . -type f -exec python -c "$pyscript" {} \;