我有一个包含以下内容的文本文件
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/
,但对于其他 2 种情况有效。
答案1
在使用 awk 打印最后一个字段之前,必须删除尾部斜杠。否则最后一个字段将为空。
使用
echo "$url" | sed -e 's#/$##' -e 's/\.git$//' | awk -F / '{print $NF}'
甚至
echo "$url" | sed -e 's#/$##' -e 's/\.git$//' -e 's#^.*/##'
尖端:
- 您可以
sed
向 sed 的一次调用发出多个命令,因此有时不需要通过管道从sed
tosed
。要么sed -e 'cmd1' -e 'cmd2' ...
或者sed 'cmd1;cmd2;...'
都会起作用。 - 您可以对命令使用不同的分隔符
s
,sed
这样您就不必转义模式中的斜杠(我用作#
分隔符)。
答案2
假设文件中的所有行都具有 .git 扩展名
还给出了没有 SED 的解决方案
SHW@SHW:/tmp/abc # cat a
https://git.centos.org/git/rpms/abc.git
https://git.centos.org/git/rpms/abc.git/
https://git.centos.org/git/rpms/abc
SHW@SHW:/tmp/abc # cat a | while read line; do basename $line .git; done
abc
abc
abc
答案3
我认为问题是字段分隔符命令的awk
。更改顺序,首先是sed
命令,然后是awk
命令:
reponame=$(echo $url | sed -e 's/.git\/$//' | sed -e 's/.git//' | awk -F/ '{print $NF}')
echo $reponame
答案4
$ sed -E -e '\%(\.git|/)$%d' -e 's%.*/%%' file
abc
上面的脚本sed
首先从输入中删除以/
或 字符串结尾的所有行.git
。然后它会删除从剩余行到最后一行的所有内容/
。
由于我们正在处理的文本包含/
,因此我们%
在表达式中使用作为替代分隔符sed
。
如果您想abc
从文件中的每一行中提取:
$ sed -E -e 's%\.git/?$%%g' -e 's%.*/%%' file
abc
abc
abc
首先从每行输入的末尾删除字符串.git
(可能后跟 a ),然后应用与第一个命令中相同的替换。/
sed