我有一个包含多行数据的简单文本文件,其中每行有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
提前致谢
答案 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
的版本)。