我正在尝试替换第300个字符并相应地添加带小数点的正号。对于除B,F和{。
之外的所有字符,Sed命令都能正常工作请在下面找到输入数据:
result_PHDPTRAR2.txt
H009704COV2009084 PHD0000001H009700204COV2009084 PROD2015122016010418371304COVH009704COV2009084 PTR0000001H0097002C00000000140000000043610000003408092A0000000068061C0000000000000{0000002939340H0000000537585H0000003476926F0000001218378G0000000040292E0000000016497{0000000000827E0000001880498A9000000320436J000000004391000000001606000000000030000000000128000000000006000000004227000000000000000000000000 00000140 0000000000000{0000000000773B0000000000000{000000000000
这里第300个字符是 A 。如果我们使用以下sed命令,它可以正常地满足上述要求:
sed -e 's/\(.\{1,255\}\)\(.\{1,34\}\)\(.\{1,9\}\)\(.*\)A/\1\2+\3.\4^/' <<< cat result_PHDPTRAR2.txt
它将用^替换A并获得以下结果。
H009704COV2009084 PHD0000001H009700204COV2009084 PROD2015122016010418371304COVH009704COV2009084 PTR0000001H0097002C00000000140000000043610000003408092A0000000068061C0000000000000{0000002939340H0000000537585H0000003476926F0000001218378G0000000040292E0000000016497{0000000000827E000+000188049.8^9000000320436J000000004391000000001606000000000030000000000128000000000006000000004227000000000000000000000000 00000140 0000000000000{0000000000773B0000000000000{000000000000
但如果我们用B,F或{替换第300个字符,那么同样的推荐不起作用。
如果我用B改变输入的第300个字符(result_PHDPTRAR2.txt)然后如果我使用sed
sed -e 's/\(.\{1,255\}\)\(.\{1,34\}\)\(.\{1,9\}\)\(.*\)B/\1\2+\3.\4^/' <<< cat result_PHDPTRAR2.txt
我得到以下结果:
H009704COV2009084 PHD0000001H009700204COV2009084 PROD2015122016010418371304COVH009704COV2009084 PTR0000001H0097002C00000000140000000043610000003408092A0000000068061C0000000000000{0000002939340H0000000537585H0000003476926F0000001218378G0000000040292E0000000016497{0000000000827E000+000188049.8B9000000320436J000000004391000000001606000000000030000000000128000000000006000000004227000000000000000000000000 00000140 0000000000000{0000000000773^0000000000000{000000000000
您可以在&#34; + 000188049.8B&#34; 中正确添加+
和小数点,但B保持不变。此处B应替换为 ^
有人可以帮助我吗?
答案 0 :(得分:1)
问题是输入中的第一个'B'字符晚于4..300字符。即输入文字与您的期望不符。
那么,现在呢?
更新
根据评论,问题是在第300个字符后的文本中有超过1个B. 。*将会到达那一点。这是如何解决它:
sed -e 's/\(.\{1,255\}\)\(.\{1,34\}\)\(.\{1,9\}\)\([^B]*\)B/\1\2+\3.\4^/'
注意否定的角色类:\([^B]*\)B
- 这将达到第一个B.不幸的是,sed没有非贪婪的量词。这样会更容易:\(.*?\)B
。