Как извлечь строку из двух строк разделителя, используя sed или awk или bash? - PullRequest
0 голосов
/ 30 апреля 2019

Я не так часто с awk или sed. Цените вашу помощь ниже:

У меня есть переменная оболочки bash $ VAR со значением:

DEFINE QLOCAL ('IIB.TESTQUEUE.MODULE') +
DESCR('Input queue for A to B') +
LIKE('MY.LOCALQ.TEMP') +
REPLACE

Я хочу извлечь значение IIB.TESTQUEUE.MODULE между QLOCAL<0 or more spaces>(' и ') из переменной оболочки $ VAR.

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

awk/sed/grep to extract the desired string

Ответы [ 4 ]

3 голосов
/ 30 апреля 2019

Запомните строку, которая соответствует:

echo "${VAR}" | sed -n "s/.*QLOCAL *('\([^']*\)').*/\1/p"

Оффтоп: используйте строчные буквы для переменных оболочки.

РЕДАКТИРОВАТЬ: Удалено [] вокруг пробела, как сказал @EdMorton.

2 голосов
/ 30 апреля 2019

Первая часть вашего регулярного выражения - это положительный вид переменной ширины:

(?<=
  TOPIC \s*\('|
  QLOCAL\s*\('|
  QALIAS\s*\('|
  SUB   \s*\('
)

Рекомендуется объединить буквенные слова в свою собственную группу альтернатив и использовать оператор \K, который отбрасывает текст, сопоставленный так далеко от текущего буфера памяти: (?:TOPIC|QLOCAL|QALIAS|SUB)\s*\('\K.

Остальное можно использовать как есть с -oP опциями и GNU grep:

grep -oP "(?:TOPIC|QLOCAL|QALIAS|SUB)\s*\('\K.*?(?='\))" file

См. Демоверсию regex и online grep demo :

s="DEFINE QLOCAL ('IIB.TESTQUEUE.MODULE') +
DESCR('Input queue for A to B') +
LIKE('MY.LOCALQ.TEMP') +
REPLACE"
grep -oP "(?:TOPIC|QLOCAL|QALIAS|SUB)\s*\('\K.*?(?='\))" <<< "$s"
# => IIB.TESTQUEUE.MODULE
1 голос
/ 30 апреля 2019
$ echo "$var" | grep -oP "QLOCAL *\('\K[^']+"

IIB.TESTQUEUE.MODULE

не уверен, почему у вас есть проблема в назначении

$ val=$(echo "$var" | grep -oP "QLOCAL *\('\K[^']+")
$ echo "$val"
IIB.TESTQUEUE.MODULE
0 голосов
/ 30 апреля 2019

Используйте простую команду вырезания: echo $VAR|cut -d' -f2

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