Как заставить sed (используя bash) остановиться на разрыве строки? - PullRequest
0 голосов
/ 16 декабря 2018

Я использую следующую команду sed для получения переменной из файла журнала Docker-compose:

sudo cat $(docker inspect --format='{{.LogPath}}' xxxxx) | grep -s TOKEN|sed 's/.*TOKEN=//'

Это работает хорошо, однако возвращает:

57ac8392-1ecc-4e17-9350-c9c866ac832b\n","stream":"stderr","time":"2018-12-16T19:55:54.032838023Z"}

TOKEN действительно: 57ac8392-1ecc-4e17-9350-c9c866ac832b.Но я не уверен, как разбить его после разрыва строки (\n), чтобы только включал UUID.

1 Ответ

0 голосов
/ 16 декабря 2018

Чтобы достичь того, что вы хотите с помощью sed, вам нужно будет захватить токен в шаблоне и использовать обратную ссылку на него в качестве замены:

$ cat data
TOKEN=57ac8392-1ecc-4e17-9350-c9c866ac832b\n","stream":"stderr","time":"2018-12-16T19:55:54.032838023Z"}

$ cat data | sed -e 's/.*TOKEN=\([-a-f0-9]\+\)\\n.*/\1/'
57ac8392-1ecc-4e17-9350-c9c866ac832b

Используете ли вы GNU grep?Если это так, вы можете нацелить токен немного проще, используя только его:

$ grep -sPo '(?<=TOKEN=)[-a-f0-9]+' < data
57ac8392-1ecc-4e17-9350-c9c866ac832b

Объяснено:

В GNU grep, -P интерпретирует данный шаблон как PCRE , который включает функции, которые недоступны в традиционном языке регулярных выражений POSIX.Одним из них является «положительный вид сзади», представленный (?<=...), который, по сути, говорит движку регулярных выражений, что нужно сделать шаг назад и посмотреть, можно ли сопоставить текст внутри вида сзади, но на самом деле не соответствует ему.Это позволяет вам сортировать «якорные» совпадения с заданной строкой, но не захватывать их.

Флаг -o для grep просто говорит ему печатать только совпадающую часть заданного ввода.

В сочетании эти два флага позволяют нам использовать TOKEN= в шаблоне для привязки совпадения, но только для печати истинных данных токена.

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