Регулярное выражение с использованием sed в UNIX - PullRequest
1 голос
/ 02 апреля 2019

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

$ cat file1.txt
select * from ${database_name}.tab_name;

Я хочу взять ${type_database_name_env} в строку и использовать команду sed replace, чтобы заменить эту переменную фактическим именем

sed -n 's/[${][a-z][_][a-z][_][a-z][_][a-z][}]/,/./p' file1.txt

Мне нужен вывод как

$ var1=`sed command` # I am looking for proper sed command
$ echo $var1
${database_name}

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

С grep вы можете использовать

var1="$(grep -o '\${[^{}]*}' file1.txt | head -1)"

. | head -1 используется для извлечения первого матча, если их больше.

См. онлайн-демонстрацию:

f='select * from ${database_name}.tab_name;'
var1="$(grep -o '\${[^{}]*}' <<< "$f" | head -1)"
echo "$var1"

С sed вы можете использовать

var1="$(sed -En 's/.*(\$\{[^{}]*}).*/\1/p' file"

См. онлайн-демонстрацию :

f='select * from ${database_name}.tab_name;'
var1="$(sed -En 's/.*(\$\{[^{}]*}).*/\1/p' <<< $f)"
echo "$var1"
# => ${database_name}

Сведения о регулярном выражении

  • .* - соответствует 0+ символов
  • (\$\{[^{}]*}) - захватывает в группу 1 (\1) и следует $ символс {, 0+ символами, отличными от { и }, а затем }
  • .* - соответствует 0+ символам.

В качестве заменыэто ссылка на текст группы 1, это все, что остается после того, как sed выполнит свою работу.Обратите внимание на параметр -E: он включает синтаксис POSIX ERE, где (...) используется для указания группы захвата, а не \(...\).

0 голосов
/ 02 апреля 2019

Вы можете просто использовать awk:

$ awk -F'[ .]+' '{print $4}' file
${database_name}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...