我有一个包含十六进制代码的大单行文件,我想使用 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)
谢谢你的帮助!
这将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并将其替换为括号中的匹配项\1和456. 如果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)