Regex 搜索并替换为sed,解释反向引用';s内容,以更正损坏的ISO-8859-1字符代码
我有文本文件(大的,数百万行),最初是用ISO-8859-1编码的,但不知怎么的被破坏了,导致“特殊”字符(从0xA0映射到0xFF的字符,是ASCII之外的字符)被八进制代码所取代 示例:“ü”字符(十六进制:0xFC)已替换为其八进制代码,位于4个字符上:“\374” 我一直在尝试编写一些sed命令来处理那些八进制代码,并将它们替换回相应的原始ISO-8859-1字符,但我缺少4字符代码的解释部分 到目前为止,我的sed命令搜索\abc形式的任何一组4个字符,其中abc是介于000和377之间的数字,然后尝试将其替换为\oabc-这应该产生ISO-8859-1编码字符:Regex 搜索并替换为sed,解释反向引用';s内容,以更正损坏的ISO-8859-1字符代码,regex,bash,sed,iso-8859-1,Regex,Bash,Sed,Iso 8859 1,我有文本文件(大的,数百万行),最初是用ISO-8859-1编码的,但不知怎么的被破坏了,导致“特殊”字符(从0xA0映射到0xFF的字符,是ASCII之外的字符)被八进制代码所取代 示例:“ü”字符(十六进制:0xFC)已替换为其八进制代码,位于4个字符上:“\374” 我一直在尝试编写一些sed命令来处理那些八进制代码,并将它们替换回相应的原始ISO-8859-1字符,但我缺少4字符代码的解释部分 到目前为止,我的sed命令搜索\abc形式的任何一组4个字符,其中abc是介于000和377之
paul@paul:~$ sed 's,\\\([0-3][0-7][0-7]\),\\o\1,g' file
但是,该替换部分无法工作,因为sed没有将\o\1解释为ISO-8859-1代码(就像我处理sed的s/u/\o374/'文件时那样)
如果我的文件包含:
(...) D\374sseldorf (...)
我的sed命令将替换为:
(...) D\o374sseldorf (...)
这里有人能指出我错在哪里吗?Gnu
sed
在解释命令时解释\oxxx
,因此它必须在sed命令中出现。(其他sed
s可能根本无法解释\oxxx
;我并不意味着他们将按照您的建议进行解释。)如前所述,\o
是无效的转义码(后面没有八进制数),因此不会被替换,而\1
将被匹配中的第一个捕获替换
使用类似Perl的语言,您可以更轻松地进行此转换,它允许您执行代码以生成替换:
perl -pe 's/\\([0-3][0-7][0-7])/chr(oct($1))/eg'
\\o\1
表示\o
后接第一个子组,这正是您得到的结果。sed不会尝试注入子组的内容并重新计算替换字符串,因为数据和代码是分开的。使用sed是没有办法做到这一点的(除了用单独的字符替换每个字符代码)。嗨,另一个家伙,我没有意识到这一点。谢谢你的评论和花时间解释。嗨,rici,谢谢你的回答。它工作得很好。这帮了大忙。很抱歉,刚才的评论。我离开电脑有一段时间了。