Как извлечь данные из содержимого файлов, включая строку и игнорируя новую строку - PullRequest
0 голосов
/ 30 января 2020

Я хочу получить имена служб из всего каталога проекта.

Все вызовы служб начинаются с указанного c шаблона:

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

getService().
thirdSName()

Обратите внимание на то, как сворачивается последнее совпадение, указанное выше. две строки; первая строка соответствует шаблону, но имя службы заключено в следующую строку.

Мое решение:

grep -r  "getService" *

Ожидаемый отчет:

serviceName1
service2
thirdSName

Но мой grep результаты являются неполными, поскольку они не включают в себя последнее имя службы.

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Вот команда поиска в сочетании со скриптом python:

#!/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" {} \;
0 голосов
/ 30 января 2020

grep не может легко выбрать, сколько показать матч, если он растягивается на несколько строк; есть только возможность указать фиксированное количество строк контекста до или после матча.

Если вам нужны пешеходы, возможно, попробуйте что-то вроде этого простого скрипта Awk.

find . -type f -exec awk '/getService/ || more {
    print FILENAME ":" NR ":" $0; more = ($0 ~ /\.[ \t]*$/) }' {} +

Это просто проверяет, является ли последний непробельный символ точкой, и если да, выбирает также следующую строку (и) для печати. ​​

Если ваши требования менее скромны, парсер для языка программирования, используемого в эти файлы, вероятно, путь к go. Если ваши требования лишь незначительно менее скромны, возможно, подход Awk можно растянуть на чуть-чуть больше.

(Оболочка find потому, что у Awk нет опции -r для обхода дерево каталогов.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...