使用 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/,但是对于其他两种情况,它有效。

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

相关内容