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

use*_*422 1 sed

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

10001340100491938001945591
10001340100491951002049591
10001340100462055002108507
10001340100492124002135591
10001340100492145002156507
10001340100472204002205591
Run Code Online (Sandbox Code Playgroud)

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

我这样尝试过:

sed 's/^(.{12})49/\58/' data.txt
Run Code Online (Sandbox Code Playgroud)

但出现此错误:

sed: -e expression #1, char 18: invalid reference \5 on `s' command's RHS
Run Code Online (Sandbox Code Playgroud)

提前致谢

Lev*_*sky 6

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

sed -E 's/^(.{11})49/\158/' data.txt
Run Code Online (Sandbox Code Playgroud)

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

根据您的输入,命令将更49改为58第 1、2、4 和 5 行。


Jot*_*tne 5

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

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