найти конкретные c слов в текстовых файлах - PullRequest
0 голосов
/ 17 февраля 2020

У меня много текстовых файлов в разных подкаталогах, причем каждый файл имеет расширение «.pro».

Каждый файл содержит одну или несколько строк, где встречается текст «PRO <name>» или «Функция <name>». После <name> следует запятая, за которой следуют переменные.

Я хотел бы создать список, состоящий из 2 столбцов:

  • 1-й столбец: полное имя файла ( с полным путем)

  • 2-й столбец: «PRO <name>» или / и «Функция <name>

Для двух файлов примеров / scripts ниже полученного текста будет:

<full path>read_scenes_out.pro  PRO READ_SCENES_CLA
<full path>read_scenes_out.pro  PRO PRO READ_TAU_IN
<full path>read_scenes_out.pro  FUNCTION READ_HRIT
<full path>read_scenes_in.pro   PRO READ_SCENES_FLG
<full path>read_scenes_in.pro   PRO READ_SCENES_ELEV
<full path>read_scenes_in.pro   PRO READ_TAU_IN
<full path>read_scenes_in.pro   FUNCTION READ_HRIT2

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

find. | grep ".pro" | sort -z

Может быть, это может быть объединено с , которые отвечают .


Два примера файлов ("..." - это место для программного кода):

  • имя файла 1 с именем "read_scenes_out.pro"

    PRO READ_SCENES_CLA , ICLA, INDATE = INDATE

    ...

    end

    PRO READ_TAU_IN, TAU, INFILE = INFILE

    ...

    end

    FUNCTION R EAD_HRIT, слот, ChannelId, счетчики, pgm = pgm

    ...

    end


  • имя файла 2 с именем "read_scenes_in.pro"

    PRO READ_SCENES_FLG, NTEST, INDIR = INDIR, INDATE = INDATE

    ...

    end

    PRO READ_SCENES_ELEV, IELEV, INDIR = INDIR

    ...

    end

    PRO READ_TAU_IN, TAU, INFILE = INFILE

    ...

    end

    FUNCTION READ_HRIT2, слот, ChannelId, счетчик, pgm = pgm

    ...

    end

1 Ответ

1 голос
/ 17 февраля 2020

Попробуйте что-то вроде

find . -name '*.pro' \
  -exec grep -Eo '(PRO|FUNCTION)[ ]+[^ ,]+' /dev/null {} +

, где пробел внутри обоих классов символов [...] состоит из пробела и табуляции.

Вывод разделителя имен файлов с помощью grep представляет собой двоеточие; не должно быть сложно изменить это с помощью простого sed шага постобработки, если это важно. Или, может быть, переключитесь с grep на Awk, чтобы иметь больше контроля над тем, как генерируется вывод.

...