使用sed替换固定位置处的特定字符串

使用sed替换固定位置处的特定字符串,sed,Sed,我有一个简单的文本文件,其中包含几行数据,每行正好有26个字符。 例如 现在,我想把第12个和第13个字符替换为第58个字符,如果这两个字符是49 我这样试过: sed 's/^(.{12})49/\58/' data.txt 但是我得到了这个错误: sed: -e expression #1, char 18: invalid reference \5 on `s' command's RHS 提前感谢捕获的组是\1,因此您需要输入11(而不是12)个字符,然后输入58: sed -E '

我有一个简单的文本文件,其中包含几行数据,每行正好有26个字符。 例如

现在,我想把第12个和第13个字符替换为第58个字符,如果这两个字符是49

我这样试过:

sed 's/^(.{12})49/\58/' data.txt
但是我得到了这个错误:

sed: -e expression #1, char 18: invalid reference \5 on `s' command's RHS

提前感谢

捕获的组是
\1
,因此您需要输入11(而不是12)个字符,然后输入
58

sed -E 's/^(.{11})49/\158/' data.txt
如果不想避开方括号和花括号,还需要
-E
-r


输入后,命令将第1、2、4和5行中的
49
更改为
58

在表达式中替换前14个字符(如果正确)。但是你需要替换11加上两个(12,13)。更重要的是,
sed
对转义括号很挑剔,因此在
\(
{
等)前面需要反斜杠。最后-捕获组的编号是
1
。您忽略了该编号

把这一切放在一起,你就会明白

sed 's/^\(.\{11\}\)49/\158/'

您可以在
sed
中使用一些标志,使表达式更“规则”(更改
vs
\(
)的含义)。我相信,什么标志取决于您的平台(sed的版本)。

如果您想尝试
awk
解决方案:

awk 'substr($0,12,2)==49 {$0=substr($0,1,11)"58"substr($0,14)}1' file
10001340100581938001945591
10001340100581951002049591
10001340100462055002108507
10001340100582124002135591
10001340100582145002156507
10001340100472204002205591

这很有效。谢谢。我是第一次使用sed。所以如果我不使用-E表达式会是什么样子?谢谢,我得到了它。sed的/^(.\{11\})49/\158/'数据。txt@user333422在我的
sed
版本中,它是
sed的/^\(.{11\}\)49/\158/'data.txt
这不起作用,尽管它看起来与下面的类似。它不是将49替换为58,而是在49后追加58,使字符串长度为28个字符,这是因为捕获的组同时包含11个字符和49个字符。@user333422-是的,很抱歉出现了字符的换位。
49
必须在捕获组之外,因此在替换过程中不会重复。我已编辑了我的答案。
awk 'substr($0,12,2)==49 {$0=substr($0,1,11)"58"substr($0,14)}1' file
10001340100581938001945591
10001340100581951002049591
10001340100462055002108507
10001340100582124002135591
10001340100582145002156507
10001340100472204002205591