从string中删除最后一个子串

时间:2015-12-23 23:29:02

标签: regex sed tcl

我想删除字符串中的最后一个子字节。 字符串的模式是:

str1.str2.strn-1.{i}.strn

,所需的结果是:

str1.str2.strn-1.{i}.

我尝试用shell echo $str |sed -e 's/\.*$//'但它不起作用

最好的方法是什么

4 个答案:

答案 0 :(得分:3)

-e开关用于添加编辑命令。您只有1个命令,因此无需使用它。相反,您希望-E标志告诉sed使用现代正则表达式。试试这个:

echo $str | sed -E 's/[^.]+$//'

[^.]+$匹配最后一个点和行尾之间的任何字符。

答案 1 :(得分:1)

使用标准sed的简短解决方案,不使用扩展正则表达式:

sed 's/[^.]*$//'

表示从行尾删除每个非点字符。有几点需要注意:

  1. 通常情况下,点(也称为句点)表示"任何字符,"但是在括号表达式中,它只匹配一个文字点,因此不需要用反斜杠转义它。
  2. 星号表示"匹配零或更多,"默认情况下,星号是贪婪的,这意味着它将匹配尽可能多的字符。
  3. 因此命令说要在行末用尽可能多的非点替换。

答案 2 :(得分:0)

使用tcl

的解决方案
regsub -- {[^.]+$} $str {} string

[^.]+$匹配最后一个'。'附加$ str

末尾的任何字符串

答案 3 :(得分:0)

让我们使用字符串 dot -separated的事实。 这是一个纯Tcl解决方案(s是原始字符串):

set s "[file rootname $s]."

set s [file rootname $s]
append s "."

根据file(n)联机帮助页,file rootname返回

...名称中的所有字符,但不包括名称的最后一个组件中的最后一个“。”字符。如果name的最后一个组件不包含点,则返回name