将 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
我有一个包含十六进制代码的大型单行文件,我想使用 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