Извлечение подстроки с использованием regexp и sed в bash-скрипте - PullRequest
0 голосов
/ 24 мая 2018

В bash-скрипте я хотел бы извлечь подстроку формы key=[value], чтобы я мог получить value в переменной, указав соответствующий key.

Дляэкземпляр, учитывая эту переменную txt:

txt="something... key=[value] number=[0.42] ...other things... text=[foo] etc"

Я хотел бы извлечь value для key, 0.42 для number, foo для text ... ипустая строка для отсутствующих ключей.

Я попробовал эту команду, чтобы извлечь value:

echo "$txt" | sed 's/^*key=\[[*]\]*/\1/'

Если я правильно понял, команда sed "s/regexp/replacement/" попытается найти здесьследующее регулярное выражение:

^ начало строки

* что-нибудь

key=\[ начало того, что я хочу найти

[*^\[] соответствует чему угодно, кроме символа [

\] конец того, что я хочу найти

* что-нибудь

$ конецстроку

и замените ее на то, что было найдено (из-за \1).

Но я что-то упускаю, так как получаю следующее сообщение об ошибке: sed: -eвыражение № 1,char 27: недопустимая ссылка \ 1 в RHS

команды `s. Я также пытался это сделать, не используя \1:

echo "$txt" | sed 's/^*key=\[[*]\]*/TEST/'

Но регулярное выражение не соответствовало, и всевозвращается строка txt ...

1 Ответ

0 голосов
/ 24 мая 2018

* не соответствует ни одной строке.* - это квантификатор, который говорит, что «предыдущий может повторяться ноль или более раз».Вам нужно регулярное выражение для sed, а не шаблон подстановочного знака:

sed 's/.*key=\[\([^]]*\)\].*/\1/'
  • \(...\) необходимо для создания группы захвата, обозначаемой \1 (потому что это первая такая группа)
  • [^]]* означает «что угодно, кроме ] ноль или более раз», поэтому оно соответствует строке в квадратных скобках
...