Чтобы достичь того, что вы хотите с помощью 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=
в шаблоне для привязки совпадения, но только для печати истинных данных токена.