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

Limit sed to certain character range in a line

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

到目前为止,我已经尝试过这个 witout 成功了

echo abc123abc123abc123 | sed 's/^\(123\{8,14\}\)/6/g'

我希望它输出

abc123abc456abc123   

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

感谢您的帮助!

您只需更改匹配模式:

^.{8}[^0-9]{0,6}([0-9]{3}).*$

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

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

$ echo abc123abc123abc123 | sed -r 's/^(.{7,11})123/56/'
abc123abc456abc123

使用 Mac OSX (BSD),尝试:

sed -E -e 's/^(.{7,11})123/56/'

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

的原因

全局替换

如果要将所有出现的 123 替换为 456,前提是 123 出现在位置 8 和 14 内,则使用:

sed -r ':again; s/^(.{7,11})123/56/; t again;'

这会不断重复替换,直到字符范围内不再有字符串123

在 OSX/BSD 上,尝试:

sed -E -e ':again' -e 's/^(.{7,11})123/56/' -e 't again'

这是一个awk解决方案:

echo abc123abc123abc123 | awk '{a=substr([=10=],1,6);b=substr([=10=],7,6);c=substr([=10=],13);sub(/123/,"456",b);print a b c}' file
abc123abc456abc123