我有一个大的一行文件,其中包含十六进制代码,我想使用sed来查找该行的某些字符范围内的模式。
到目前为止,我已经试过这样的智慧
echo abc123abc123abc123 | sed 's/^\(123\{8,14\}\)/\456/g'我想把它输出
abc123abc456abc123 (只有在字符位置8至14之间找到时,才替换模式123 )
谢谢你的帮忙!
发布于 2015-04-29 20:10:29
这将123在字符位置8至14中的第一次出现替换为456。
$ echo abc123abc123abc123 | sed -r 's/^(.{7,11})123/\1456/'
abc123abc456abc123使用Mac (BSD),尝试:
sed -E -e 's/^(.{7,11})123/\1456/'这是通过查找模式^(.{7,11})123并用parens、\1和456中的匹配来实现的。如果123从第8位开始,这意味着它前面有7个字符。如果它在第14位结束,那就意味着它前面有11个字符。这就是我们匹配^(.{7,11})的原因。
全局替换
如果您想用456替换所有123,条件是123发生在第8和第14位置内,那么请使用:
sed -r ':again; s/^(.{7,11})123/\1456/; t again;'这会一直重复替换,直到字符范围内没有更多的字符串123。
在OSX/BSD上,试着:
sed -E -e ':again' -e 's/^(.{7,11})123/\1456/' -e 't again'发布于 2015-04-29 20:02:34
您只需更改匹配模式:
^.{8}[^0-9]{0,6}([0-9]{3}).*$在这里,我假设您只想替换数字0-9。如果这不是您想要的,您必须提供更多的信息、源数据示例,并正式指定如何匹配替换序列。
发布于 2015-04-30 05:57:38
下面是一个awk解决方案:
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
abc123abc456abc123https://stackoverflow.com/questions/29953042
复制相似问题