У меня есть текстовый файл, который содержит следующие
https://git.centos.org/git/rpms/abc.git
https://git.centos.org/git/rpms/abc.git/
https://git.centos.org/git/rpms/abc
Когда я запускаю следующую команду,
reponame=$(echo $url | awk -F/ '{print $NF}' | sed -e 's/.git\/$//' | sed -e 's/.git//')
echo $reponame
Я должен получить
abc
Он не работает для строк, заканчивающихся в .git/
, но работает для двух других случаев.
Используя grep
с PCRE (-P
):
grep -Po '.*/\K[^.]+' file.txt
желаемая часть извлечена [^.]+
, .*/
соответствия часть прежде abc
и \K
отбрасывания соответствие.
Пример:
$ cat file.txt
https://git.centos.org/git/rpms/abc.git
https://git.centos.org/git/rpms/abc.git/
https://git.centos.org/git/rpms/abc
$ grep -Po '.*/\K[^.]+' file.txt
abc
abc
abc
<час> Подобная логика с помощью sed
, с помощью группировки шаблона:
$ sed -r 's#.*/([^.]+).*#\1#' file.txt
abc
abc
abc
Я знаю, что вопрос просит a sed
решение, однако предполагая, что строка извлекает, всегда будет в 6-м поле как в примере, который это более легко сделано с помощью AWK
:
awk -F/ 'match($6, /^[^.]+/, x) {print x[0]}' file
-F/
: устанавливает разделитель поля ввода на /
;match($6, /^[^.]+/, x)
: если шестое поле соответствует ^[^.]+
один или несколько раз, хранит соответствия в массив x
выполнение следующего блока;{print x[0]}
: печатает первый элемент x
.% cat file
https://git.centos.org/git/rpms/abc.git
https://git.centos.org/git/rpms/abc.git/
https://git.centos.org/git/rpms/abc
% awk -F/ 'match($6, /^[^.]+/, x) {print x[0]}' file
abc
abc
abc