sed命令不适用于unix中的某些字符

时间:2016-05-02 08:03:06

标签: unix sed

我正在尝试替换第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应替换为 ^

有人可以帮助我吗?

1 个答案:

答案 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