首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用sed替换10位序列

如何使用sed替换10位序列
EN

Unix & Linux用户
提问于 2023-05-11 09:49:39
回答 4查看 80关注 0票数 2

使用'sed‘,我想用1234567890替换任何10位序列

这是可行的,但不太优雅。

代码语言:javascript
运行
复制
echo "code=1111111111" | sed 's/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/1234567890/'

这不管用

代码语言:javascript
运行
复制
echo "code=1111111111" | sed 's/[0-9]{10}/1234567890/'

结果

代码语言:javascript
运行
复制
code=1111111111

有人能提出一个简单优雅的解决方案,使用'sed‘吗?

EN

回答 4

Unix & Linux用户

回答已采纳

发布于 2023-05-11 10:05:21

sed默认使用基本正则表达式,这意味着{10}将被视为纯文本。

您可以验证这一点:

代码语言:javascript
运行
复制
echo "code=1{10}" | sed 's/[0-9]{10}/1234567890/'

将产生以下结果:

代码语言:javascript
运行
复制
1234567890

在你的情况下,你需要:

  • 使用-E选项指定要使用扩展正则表达式。
  • 像这样逃离{}\{10\}
代码语言:javascript
运行
复制
echo "code=1111111111" | sed -E 's/[0-9]{10}/1234567890/'
echo "code=1111111111" | sed 's/[0-9]\{10\}/1234567890/'
票数 5
EN

Unix & Linux用户

发布于 2023-05-11 14:13:57

使用ERE regex风味:

代码语言:javascript
运行
复制
$ echo "code=1111111111" | sed -E 's/[0-9]{10}/1234567890/'
code=1234567890
票数 4
EN

Unix & Linux用户

发布于 2023-05-11 15:35:35

如果您想用每行1234567890替换10位(而不是更多的ASCII十进制数字)的第一个序列,那么应该是:

代码语言:javascript
运行
复制
sed -E 's/(^|[^0123456789])[0123456789]{10}([^0123456789]|$)/\112345678900\2/'

也就是说,只替换10位数字(使用[0123456789]而不是[0-9],因为后者可以匹配比仅仅0123456789多个字符,这取决于sed实现和/或区域设置),前面是行的开头或非数字,后面是非数字或行尾。

这样仍然可以将1112223334.6替换为1234567890.6,或者将1.0000000000e-2替换为1.1234567890e-2,或者将0xff0777888999ee替换为0xff1234567890ee,因此您可能需要根据您想要的内容和在输入中找到的内容进行调整。

若要替换所有10位(而不是更多位数)的序列,可以是:

代码语言:javascript
运行
复制
sed -E 's/[0123456789]+/\
&\
/g; s/\n[0123456789]{10}\n/123456789/g;s/\n//g'

或者您可以切换到perl

代码语言:javascript
运行
复制
perl -pe 's/(?<!\d)\d{10}(?!\d)/1234567890/g'

使用负的查找操作符来检查10位小数位的顺序,既不前面也不后面跟着另一个数字。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/745581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档