Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 搜索并替换为sed,解释反向引用';s内容,以更正损坏的ISO-8859-1字符代码_Regex_Bash_Sed_Iso 8859 1 - Fatal编程技术网

Regex 搜索并替换为sed,解释反向引用';s内容,以更正损坏的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之

我有文本文件(大的,数百万行),最初是用ISO-8859-1编码的,但不知怎么的被破坏了,导致“特殊”字符(从0xA0映射到0xFF的字符,是ASCII之外的字符)被八进制代码所取代

示例:“ü”字符(十六进制:0xFC)已替换为其八进制代码,位于4个字符上:“\374”

我一直在尝试编写一些sed命令来处理那些八进制代码,并将它们替换回相应的原始ISO-8859-1字符,但我缺少4字符代码的解释部分

到目前为止,我的sed命令搜索\abc形式的任何一组4个字符,其中abc是介于000和377之间的数字,然后尝试将其替换为\oabc-这应该产生ISO-8859-1编码字符:

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,谢谢你的回答。它工作得很好。这帮了大忙。很抱歉,刚才的评论。我离开电脑有一段时间了。