3

我在数据中有一组标记并希望去掉尾随".[0-9]",但是我无法弄清楚如何正确引用正则表达式。第一场比赛应该全部由 the.和第二个 the.和一个数字组成。我打算保留第一场比赛。

data="thing thing__aaa.0 thing__bbb.3 thing__ccc.5 other_aaa other_bbb other_ccc.5"
data=`echo $data | sed s/\([a-zA-Z0-9_]+\)\(\.[0-9]\)/\1/g`
echo $data

实际输出:

thing thing__aaa.0 thing__bbb.3 thing__ccc.5 other_aaa other_bbb other_ccc.5

期望的输出:

thing thing__aaa thing__bbb thing__ccc other_aaa other_bbb other_ccc

这个想法是 unquoted([a-zA-Z0-9_]+)是第一个匹配组,并且(\.[0-9])匹配.number. 应该用\1第一组替换两组。

4

3 回答 3

1

刚刚怎么样

echo $data | sed 's/\.[0-9]//g'

或者如果 number 可能包含更多数字,则

echo $data | sed 's/\.[0-9]\+//g'
于 2012-11-23T16:42:53.283 回答
0

看起来您只想删除表单的所有字符串\.[0-9]。那么为什么不这样做:

sed 's/\.[0-9]+\b//g'

(这依赖于 gnu sed\b+扩展。对于其他 sed,您可以执行以下操作:

sed 's/\.[0-9][0-9]*\( \|$\)/\1/g'
于 2012-11-23T16:50:14.110 回答
-1

我通常不鼓励使用特定于 shell 的扩展,但如果你使用 bash,你可能会很乐意使用数组:

bash$ data=(thing thing__aaa.0 thing__bbb.3)
bash$ echo "${data[@]%.[0-9]*}"

请注意,这还将删除并非全为数字的扩展名(即foo.34bb),但可能足以满足您的需要。)

于 2012-11-23T17:08:01.243 回答