我有一个包含以下内容的文本文件
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/
,但是对于其他两种情况,它有效。
答案1
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
答案2
我知道问题要求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