regex - 正则表达式删除最后两个破折号的输出

标签 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

但我希望输出排除这种模式

最佳答案

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

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/

相关文章:

regex - PostgreSQL - 使用 regexp_split_to_table 将单词 (len>1) 拆分为行

python - 如何在Networkx中使用Python字符串匹配函数查找节点?

c - C 中函数读取文件的意外行为

c - 运行c程序的linux脚本

linux - 在 shell 脚本中使用 passwd 命令

linux - Maven - 无法在 shell 脚本中创建资源输出目录

C# 正则表达式替换模式(替换字符串)返回 $1

php - UTF-8贯穿始终

bash - bash 是否在 ${var+...} 中错误地进行了 "$@"扩展?

PHP检查SSN的长度