使用sed替换固定位置处的特定字符串
我有一个简单的文本文件,其中包含几行数据,每行正好有26个字符。 例如 现在,我想把第12个和第13个字符替换为第58个字符,如果这两个字符是49 我这样试过:使用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 '
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