我正在尝试编写一个脚本,删除字符最后一次出现后的所有内容。例如,如果字符串是DATETIME 2014.03.14 12:23:24
,我只想得到DATETIME 2014.03.
。因此,最后一个点出现后的所有内容都应被删除。我一直在尝试使用和的不同变体,sed
但expr 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.
捕获分隔符的位置不需要在替换模式中明确地重新输入它。