首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >限制为行中的某一字符范围

限制为行中的某一字符范围
EN

Stack Overflow用户
提问于 2015-04-29 19:40:12
回答 3查看 3.1K关注 0票数 4

我有一个大的一行文件,其中包含十六进制代码,我想使用sed来查找该行的某些字符范围内的模式。

到目前为止,我已经试过这样的智慧

代码语言:javascript
复制
echo abc123abc123abc123 | sed 's/^\(123\{8,14\}\)/\456/g'

我想把它输出

代码语言:javascript
复制
abc123abc456abc123   

(只有在字符位置8至14之间找到时,才替换模式123 )

谢谢你的帮忙!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-29 20:10:29

这将123在字符位置8至14中的第一次出现替换为456

代码语言:javascript
复制
$ echo abc123abc123abc123 | sed -r 's/^(.{7,11})123/\1456/'
abc123abc456abc123

使用Mac (BSD),尝试:

代码语言:javascript
复制
sed -E -e 's/^(.{7,11})123/\1456/'

这是通过查找模式^(.{7,11})123并用parens、\1456中的匹配来实现的。如果123从第8位开始,这意味着它前面有7个字符。如果它在第14位结束,那就意味着它前面有11个字符。这就是我们匹配^(.{7,11})的原因。

全局替换

如果您想用456替换所有123,条件是123发生在第8和第14位置内,那么请使用:

代码语言:javascript
复制
sed -r ':again; s/^(.{7,11})123/\1456/; t again;'

这会一直重复替换,直到字符范围内没有更多的字符串123

在OSX/BSD上,试着:

代码语言:javascript
复制
sed -E -e ':again' -e 's/^(.{7,11})123/\1456/' -e 't again'
票数 6
EN

Stack Overflow用户

发布于 2015-04-29 20:02:34

您只需更改匹配模式:

代码语言:javascript
复制
^.{8}[^0-9]{0,6}([0-9]{3}).*$

在这里,我假设您只想替换数字0-9。如果这不是您想要的,您必须提供更多的信息、源数据示例,并正式指定如何匹配替换序列。

票数 1
EN

Stack Overflow用户

发布于 2015-04-30 05:57:38

下面是一个awk解决方案:

代码语言:javascript
复制
echo abc123abc123abc123 | awk '{a=substr($0,1,6);b=substr($0,7,6);c=substr($0,13);sub(/123/,"456",b);print a b c}' file
abc123abc456abc123
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29953042

复制
相关文章

相似问题

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