Запустите Regex, используя Grep / Sed рекурсивно над файлами для хранения группы захвата - PullRequest
1 голос
/ 11 июня 2019

У меня есть файловая структура, которая выглядит следующим образом:

  • Папка1
    • file1.feature
    • file2.feature
    • file3.feature
  • Папка2
    • file1.feature
    • file2.feature
    • ... и т. д.

Файлы представляют собой файлы объектов Behat, которые выглядят следующим образом:

Scenario: I am filling out a form
    Given I am logged in as User
    And I fill in "Name" with "My name"
    Then I fill in "Email" with "myemail@example.com"

Я пытаюсь перебрать каждый файл в структуре файла, чтобы получить совпадения на моемregex:

/I fill in "[^"]+" with "([^"]+)"/gm

Регулярное выражение ищет, я заполняю "x" с "y", и я хотел бы сохранить группу захвата "y" из каждого файла, где строка в файле соответствует выражению.

Пока что я могу перебирать папки и распечатывать имена файлов в скрипте mt Bash следующим образом:

#!/bin/bash

cd behat/features

files="*/*.feature"


for f in $files
do
    echo ${f}
done

Я пытаюсь получить группу захвата с помощью Sed в настоящее время, выполнивэто в моем цикле:

sed -r 's/^I fill in \"[^)]+\" with \"([^)]+)\"$/\1/'

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

1 Ответ

2 голосов
/ 11 июня 2019

Вы можете использовать

cd behat/features && find . -name *.feature -type f -print0 | xargs -0 \
  sed -E -n 's/.*I fill in "[^"]+" with "([^"]+)"/\1/p' > outfile

Эта команда «переходит» в каталог behat/features, находит все файлы с расширением feature (рекурсивно) и затем печатает значения группы захвата # 1, соответствующие вашему регулярному выражению, так как опция -n подавляет вывод строк и * Флаг 1007 * выводит только то, что осталось после замены.

См. Более конкретные решения для рекурсивного сопоставления файлов на Как выполнить рекурсивный поиск / замену строки с помощью awk или sed? , если это необходимо.

...