Предположим, что строка такая:
foo bar ENV['PGHOST'] another bar
Я хотел бы получить значение PGHOST
в квадратные скобки рядом с ENV
. Я предполагаю, что у линии есть только один такой случай. Итак, это: foo bar ENV['PGHOST'] another bar ENV['FOO'] and foo
не является входом.
Тем не менее, строка может прийти с "
вместо '
, как это:
foo bar ENV["PGHOST"] another bar
Другими словами, значение, которое я хочу получить, может быть заключено в двойные или одинарные кавычки.
Мало того, фактическое значение может содержать двойные или одинарные кавычки. Если он заключен в одинарные кавычки, то он может содержать двойные кавычки. Если он заключен в двойные кавычки, то он может содержать одинарную кавычку. Итак, эти две строки являются допустимыми ожидаемыми данными:
foo bar ENV["PGH'OST"] another bar
foo bar ENV['PGH"OST'] another bar
Если я получу строки, подобные приведенным выше, результатом должны быть PGH'OST
и PGH"OST
соответственно.
Я знаю, как получить значение, если оно не содержит кавычек. Вот как я это делаю:
SED_COMMAND="s/^.*ENV\[['\"]\([^'\"]*\)['\"]\].*$/\1/"
echo $input | sed ${SED_COMMAND}
Таким образом, вышеприведенное прекрасно работает для input
, foo bar ENV['PGHOST'] another bar
или foo bar ENV["PGHOST"] another bar
.
Но он не работает для foo bar ENV['PG"HOST'] another bar
, ни для другого бара foo bar ENV["PG'HOST"] another bar
.
Любая помощь приветствуется. Обратите внимание, что мне не нужно решать проблему с помощью sed
. Любое другое предложение является приемлемым.
Обновление Обратите внимание, что я мог бы иметь такие данные:
foo bar ENV['PGHOST'] another bar "what a world" I 'live' in
foo bar ENV["PGHOST"] another bar "what a world" I 'live' in
т.е. двойные и / или одинарные кавычки могут существовать в частях ввода, которые находятся вне ключа ENV
я хочу извлечь.
Обновить Другой пример правильного ввода:
foo bar ENV['PGHOST'] another bar in NEW['YORK'] to visit
это может быть действительный вход. Мне нужно получить PGHOST
.
И это тоже верно:
foo bar ENV["PGH'OST"] another bar ["baz"]
который должен вернуть PGH'OST
.