Получить содержимое между двумя символами в сценарии оболочки - PullRequest
0 голосов
/ 05 октября 2019

У меня есть строковый вывод, подобный этому: .*john*., и я хочу сохранить john в переменной, чтобы использовать его после этого, я пытаюсь использовать sed, чтобы эта часть строки выполняла это echo .*john*.|sed -e 's/\\*(.*\)\\*/', и яесть следующая ошибка sed -e expression #1,character 14:order s not terminated. Что я делаю не так?

Ответы [ 4 ]

1 голос
/ 05 октября 2019

Это работает:

echo '.*john*.' | sed 's/^\.\*\(.*\)\*\./\1/'
0 голосов
/ 05 октября 2019

Использование оператора bash =~ для хранения john в переменной, чтобы использовать его после этого :

$ var=".*john*."                                          
$ [[ $var =~ \.\*([^*]*)\*\. ]] && echo ${BASH_REMATCH[1]}  # now it's in a var
john
0 голосов
/ 05 октября 2019

Это можно сделать с помощью awk

echo '.*john*.' | awk -F* '{print $2}'
john

. Установите разделитель полей на * и напечатайте второе поле.

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

Исходя из вопроса, похоже, что цель состоит в том, чтобы извлечь строку S, заключенную в начальные и конечные символы '*'.

Несколько проблем с REGEXP: 2 приведет к грамматической ошибке, одну исправимвыходные данные

  1. Команда 's' всегда принимает 2 параметра: PATTERN (который был предоставлен) и REPLACEMENT, который должен быть здесь «\ 1», поскольку выходные данные должны содержать имя «john»,Пропущенная ЗАМЕНА является источником сообщения об ошибке (не определено 's')
  2. PATTERN должен заключать в кавычки '('
  3. * PATTERN должен соответствовать всей строке, добавляя префикс шаблона с'^. ' и добавляя в конец '. $'. Это заменит всю строку на совпавшую строку.
echo '.*john*.' |sed -e 's/^.*\*\(.*\)\*.*$/\1/'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...