如何在bash中删除字符串中的非贪婪后缀?

如何在bash中删除字符串中的非贪婪后缀?,bash,file-rename,Bash,File Rename,我想从以最后一个.svc.开头的字符串中删除任何后缀。例如: abc.svc.cluster.local=>abc abc.svc.svc.cluster.local=>abc.svc abc.txt=>abc.txt abc.svc.xyz.svc.zzz=>abc.svc.xyz svc.xxx=>svc.xxx(svc之前缺少) 如果我这样做是Go,我会找到substring.svc.的最后一个索引,然后从该索引进行修剪 在bash中如何执行此操作?谢谢。像这样: [步骤101]$v=ab

我想从以最后一个
.svc.
开头的字符串中删除任何后缀。例如:

abc.svc.cluster.local
=>
abc

abc.svc.svc.cluster.local
=>
abc.svc

abc.txt
=>
abc.txt

abc.svc.xyz.svc.zzz
=>
abc.svc.xyz

svc.xxx
=>
svc.xxx
(svc之前缺少

如果我这样做是
Go
,我会找到substring
.svc.
的最后一个索引,然后从该索引进行修剪

在bash中如何执行此操作?谢谢。

像这样:

[步骤101]$v=abc.svc.svc.cluster.local
[步骤102]$echo${v%.svc*}
abc.svc
[步骤103]$v=abc.svc.cluster.local
[步骤104]$echo${v%.svc*}
abc
[步骤105]$
对于贪婪行为,使用
%%

[步骤105]$v=abc.svc.svc.cluster.local
[步骤106]$echo${v%%.svc*}
abc
[步骤107]$

根据man bash:

  • ${参数%word}
    ${parameter%%word}

    单词被展开以产生一个模式,就像在路径名展开中一样。如果模式匹配参数扩展值的尾随部分,则扩展的结果是删除了最短匹配模式(
    %
    案例)或最长匹配模式(
    %
    案例)的参数扩展值。[……]


使用
重命名
实用程序,如下所示:

rename --dry-run 's{(.*)[.]svc.*}{$1}' *
当对计划的更改感到满意时,删除
--试运行

rename 's{(.*)[.]svc.*}{$1}' *
命令行实用程序
rename
有多种风格。他们中的大多数人应该为这项任务工作。我使用了亚里士多德·帕格尔茨的1.601版。要安装
rename
,只需下载其Perl脚本并将其放入
$PATH
。或者使用
conda
安装
rename
,如下所示:

conda install rename

为完整起见,请在您的问题中指定字符串
abc.txt
abc.svc.xyz.svc.zzz
svc.xxx
?我已经添加了这些的答案。我已经添加了一些示例。它也应该适用于您的新示例。
[步骤…]
这使得阅读起来更加困难。在这种情况下,用
$
替换所有提示会更好。