使用 sed 删除正斜杠

使用 sed 删除正斜杠

我有一个包含以下内容的文本文件

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 的一次调用发出多个命令,因此有时不需要通过管道从sedto sed。要么sed -e 'cmd1' -e 'cmd2' ...或者sed 'cmd1;cmd2;...'都会起作用。
  • 您可以对命令使用不同的分隔符ssed这样您就不必转义模式中的斜杠(我用作#分隔符)。

答案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

相关内容