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

У меня есть MySQL файл дампа, содержащий несколько таблиц. У меня уже есть команда SED для извлечения одной таблицы .

Теперь мне нужно знать, как извлечь только записи, связанные с указанным c unit_id. Формат выглядит следующим образом:

INSERT INTO tablename (1,999,'sometext'), (2,999,'othertext'),(3,997,'text here'),(4,123,'a string'), ...

Где 999 - идентификатор устройства (для одного идентификатора устройства может быть несколько записей)

Мой желаемый результат:

999,'sometext'
999,'othertext'
...

... для каждой записи, где во втором столбце появляется 999 (или любое конкретное c выбранное число).

Я пытался использовать sed для выбора значений в скобках, например:

sed -n 's/\((.*,999,.*)\)/\1/p' < result.sql

Где 999 - это идентификатор, который я ищу.

, но он ничего не возвращает.

Ответы [ 2 ]

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

Sed не может одновременно выводить несколько результатов сопоставления в одной строке. В качестве обходного пути мы можем разбить входную строку с соответствующей пунктуацией на несколько строк в качестве предварительной обработки.

Попробуйте следующее:

sed 's/), *(/)\'$'\n''(/g' result.sql | sed -n 's/.*,\(999,.*\)).*/\1/p'

Вывод:

999,'sometext'
999,'othertext'
  • Первая команда sed s/), *(/)\'$'\n''(/g' находит запятую между закрывающей и открывающей паренями, а затем заменяет ее новой строкой. (Предполагается, что вы используете bash).
  • Следующая sed команда 's/.*,\(999,.*\)).*/\1/p' извлекает нужные значения.

В качестве альтернативы grep с опцией -P ( perl -поддерживаемая поддержка регулярных выражений) также будет работать.

grep -Po '(?<=,)999,.*?(?=\))' result.sql
  • Шаблон (?<=,) - это утверждение с нулевой шириной, которое соответствует ведущей запятой без включения ее в результат.
  • Образец .*? избегает совпадения greedy.
  • Образец (?=\)) - это предположение с нулевой шириной, которое соответствует конечной правой части без включения его в результат.
1 голос
/ 30 января 2020

С GNU awk для мульти-символьных RS и RT:

$ awk -v RS='[(][^)]+)' -F'[(),]' -v OFS=, '{$0=RT} $3==999{print $3, $4}' file
999,'sometext'
999,'othertext'
...