Как я могу выбрать токен из строки в ksh / bash? - PullRequest
0 голосов
/ 05 октября 2018

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

Итак, это моя проблема - я хочу проанализировать строки SQL, как показано ниже:

select * from my_table where col1 = #ABC# and col2 like "%#DEF#%";

Я хочу каким-то образом выловить токены ABC и DEF, анализируя для разграничения # s.Попытка с sed, я получаю что-то вроде:

# echo "something#ABC#else" | sed 's/.*\(#..*#\).*/\1/g'
#ABC#

, но это ловит только один, если их больше:

# echo "something#ABC#else something#DEF#else" | sed 's/.*\(#..*#\).*/\1/g'
#DEF#

Кажется, я здесь иду по неправильным линиям- есть ли лучший способ?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Допущения:

  • существует четное количество разделителей (#), например, '# ABC # def # GHI #' будет действительным, но '# ABC # def #' будетнедопустимо
  • вывод не должен содержать разделитель
  • каждый проанализированный токен помещается в отдельную / новую строку
  • нас интересует ALL символы (не просто буквы / цифры), которые находятся между парой разделителей

При четном количестве разделителей мы можем awk отображать четные поля, например:

$ echo "something#ABC#else something#DEF#else" | awk -F"#" '{ for (i=2; i<=NF; i+=2) { print $i } }'
ABC
DEF
  • -F"#" - обозначить # как awk's разделитель поля ввода
  • for (i=2; i<=NF; i+=2) - пройти через наши четные поля, используя i в качестве индекса
  • print $i - выведите поле ith

Или, если вы хотите исключить подоболочку (вызывается echo ... |), вы можете использовать строку здесь:

$ awk -F"#" '{ for (i = 2; i <= NF; i+=2) { print $i } }' <<< "something#ABC#else something#DEF#else"
ABC
DEF
0 голосов
/ 05 октября 2018
$ echo "something#ABC#else something#DEF#else" | grep -oP '(?<=#)[A-Z0-9a-z]+(?=#)'
ABC
DEF

Использование grep lookbehind

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