如何从文件内容中提取数据,包括字符串和忽略换行符

时间:2020-01-30 07:31:51

标签: bash grep

我想从项目的整个目录中检索服务名称。

所有服务呼叫均以特定模式开始:

getService().serviceName1()
getService().service2()

getService().
thirdSName()

注意上面的最后一场比赛是如何折叠成两行的;第一行与模式匹配,但服务名称包装在下一行。

我的解决方案:

grep -r  "getService" *

预期报告:

serviceName1
service2
thirdSName

但是我的grep结果不完整,因为它们不包含最后的服务名称。

2 个答案:

答案 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" {} \;
相关问题