如何用sed保留匹配的第一个实例

时间:2012-11-23 16:35:57

标签: regex sed sh

我在数据中有一组标记,并希望剥离尾随".[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应该用第一组替换两个组。

3 个答案:

答案 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),但也可能足以满足您的需求。)