使用sed将特定字符串替换为固定位置

时间:2014-06-28 19:01:20

标签: sed

我有一个包含多行数据的简单文本文件,其中每行有26个字符。 E.g。

10001340100491938001945591
10001340100491951002049591
10001340100462055002108507
10001340100492124002135591
10001340100492145002156507
10001340100472204002205591

现在,如果这两个字符只有49个字符58,我想替换第12和第13个字符。

我试过这样:

sed 's/^(.{12})49/\58/' data.txt

但是我收到了这个错误:

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

提前致谢

3 个答案:

答案 0 :(得分:4)

捕获的群组为\1,因此您要放置11个(不是12个)字符,然后58

sed -E 's/^(.{11})49/\158/' data.txt

如果您不想转义方括号和大括号,还需要-E-r

根据您的输入,该命令会在第1,2,4和5行中将49更改为58

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

在你的表达式中,你将替换前14个字符(如果你正确的话)。但是你需要替换11加上两个(第12,13)。更重要的是,sed对于转义括号非常繁琐,因此您需要在\({前面使用反斜杠等。最后 - 捕获组的编号为1。你省略了那个号码。

总而言之,你得到了

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

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