我可以有两个输入 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
但我希望输出排除这种模式
最佳答案
您需要捕获连字符之前的部分:
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
但更合适的做法是只删除连字符之间的最后两部分
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}$
和 \(-[0-9]*\)\{2\}$
在 POSIX BRE 语法中。
关于regex - 正则表达式删除最后两个破折号的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53834195/