我在数据中有一组标记,并希望剥离尾随".[0-9]"
,但我无法弄清楚如何正确引用正则表达式。第一场比赛应该全部到.
,第二场比赛应该是.
和一个数字。我打算保留第一场比赛。
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
我们的想法是,不带引号的([a-zA-Z0-9_]+)
是第一个匹配的组,(\.[0-9])
匹配.number
。 \1
应该用第一组替换两个组。
答案 0 :(得分:1)
如何
echo $data | sed 's/\.[0-9]//g'
或者如果数字可能包含更多数字,那么
echo $data | sed 's/\.[0-9]\+//g'
答案 1 :(得分:0)
您似乎只想删除\.[0-9]
形式的所有字符串。那么为什么不做呢:
sed 's/\.[0-9]+\b//g'
(这取决于gnu sed的\b
和+
扩展程序。对于其他sed,您可以这样做:
sed 's/\.[0-9][0-9]*\( \|$\)/\1/g'
答案 2 :(得分:-1)
我通常不鼓励使用特定于shell的扩展,但是如果你使用bash,你可能会对使用数组感到高兴:
bash$ data=(thing thing__aaa.0 thing__bbb.3)
bash$ echo "${data[@]%.[0-9]*}"
请注意,这也会删除不是所有数字的扩展名(即foo.34bb
),但也可能足以满足您的需求。)