Bash 子字符串中最后一次出现的字符

Bash 子字符串中最后一次出现的字符

我正在尝试编写一个脚本,删除字符最后一次出现后的所有内容。例如,如果字符串是DATETIME 2014.03.14 12:23:24,我只想得到DATETIME 2014.03.。因此,最后一个点出现后的所有内容都应被删除。我一直在尝试使用和的不同变体,sedexpr index没有成功。上次我尝试获取最后一个点的索引,然后对其进行子串化,但没有任何结果:

expr index "DATETIME 2014.03.14 12:23:24" '.[0-9][/&][0-9]'

这将返回第一个点的位置而不是最后一个点的位置。

答案1

使用参数扩展。%删除字符串的最后部分

 d='DATETIME 2014.03.14 12:23:24'
 echo ${d%.*}.

输出:

DATETIME 2014.03.

答案2

为了完整起见,我演示了一种解决问题的方法sed

$ echo "DATETIME 2014.03.14 12:23:24" | sed 's/[^.]*$//'
DATETIME 2014.03.
  • [^.]*$匹配任何内容一个文字点,0 次或更多次,后跟行尾。

请注意,这将从不包含分隔符的字符串中删除所有字符。如果不希望出现这种情况,可以将替换“锚定”到分隔符的版本如下:

$ echo "DATETIME 2014.03.14 12:23:24" | sed 's/\.[^.]*$/./'
DATETIME 2014.03.
  • \.匹配文字点。
  • 最后一次出现时会.重新插入原本会被删除的分隔符。没有这种额外重复的变体可能是:

    $ echo "DATETIME 2014.03.14 12:23:24" | sed 's/\(\.\)[^.]*$/\1/'
    DATETIME 2014.03.
    

    捕获分隔符的位置不需要在替换模式中明确地重新输入它。

相关内容