Regx从最后两个破折号中删除输出

时间:2018-12-18 13:31:53

标签: regex linux shell

我可以有两个输入1234-5-8888-8978或1234-8888-8978,我只想在最后两个破折号(hypen)之后删除字符串。

输入:1234-5-8888-8978 输出:1234-5(删除最后两个连字符后的内容) 输入:1234-8888-8978 输出:1234(删除最后两个连字符后的内容)

我在用东西

echo "1234-5-8888-8978" | sed -n  's/.*\(-[0-9]*-[0-9]*$\)/\1/p'
-8888-8978

echo "1234-8888-8978" | sed -n  's/.*\(-[0-9]*-[0-9]*$\)/\1/p'
-8888-8978

但是我希望输出排除此模式

1 个答案:

答案 0 :(得分:1)

您需要先捕获连字符之前的部分:

sed 's/\(.*\)-[0-9]*-[0-9]*$/\1/' <<< "1234-5-8888-8978"
# => 1234-5 (POSIX BRE)
sed -E  's/(.*)-[0-9]*-[0-9]*$/\1/' <<< "1234-8888-8978"
# => 1234 (POSIX ERE)

请参见online demo

但是更合适的是删除连字符之间的最后2个部分,例如

sed 's/-[0-9]*-[0-9]*$//' <<< "1234-5-8888-8978"
# => 1234-5 (POSIX BRE will suffice)

请参见another demo

-[0-9]*-[0-9]*$模式与-匹配,并在字符串末尾两次跟着0+数字。可以用POSIX ERE语法写成(-[0-9]*){2}$,用POSIX BRE语法写成\(-[0-9]*\)\{2\}$