我可以有两个输入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
但是我希望输出排除此模式
答案 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\}$
。