将 sed 限制为一行中的特定字符范围

Mar*_*euf 4 sed

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

到目前为止,我已经尝试过这种方式成功

echo abc123abc123abc123 | sed 's/^\(123\{8,14\}\)/\456/g'
Run Code Online (Sandbox Code Playgroud)

我想输出

abc123abc456abc123   
Run Code Online (Sandbox Code Playgroud)

(仅当在字符位置 8 到 14 之间找到时才替换模式 123)

谢谢你的帮助!

Joh*_*024 6

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

$ echo abc123abc123abc123 | sed -r 's/^(.{7,11})123/\1456/'
abc123abc456abc123
Run Code Online (Sandbox Code Playgroud)

使用 Mac OSX (BSD),尝试:

sed -E -e 's/^(.{7,11})123/\1456/'
Run Code Online (Sandbox Code Playgroud)

这通过查找模式^(.{7,11})123并将其替换为括号中的匹配项\1456. 如果123从第 8 个位置开始,则意味着它前面有七个字符。如果它在第 14 个位置结束,则意味着它前面有 11 个字符。这就是我们匹配的原因^(.{7,11})

全局替换

如果您想用 456 替换所有出现的 123,前提是 123 出现在位置 8 和 14 内,请使用:

sed -r ':again; s/^(.{7,11})123/\1456/; t again;'
Run Code Online (Sandbox Code Playgroud)

这会不断重复替换,直到123字符范围内没有更多字符串为止。

在 OSX/BSD 上,尝试:

sed -E -e ':again' -e 's/^(.{7,11})123/\1456/' -e 't again'
Run Code Online (Sandbox Code Playgroud)