sed和perl没有替换文件中的字母

时间:2013-10-19 06:10:49

标签: perl sed

我有一个文件1.htm。我想替换一个字母ṣ(带有以下点的s)。我尝试使用sed和perl,它不会替换。

sed -i 's/ṣ/s/g' "1.htm"
perl -i -pe 's/ṣ/s/g' "1.htm"

任何人都可以建议做什么

1.html(不替换ṣ)

此外,我发现了另一件奇怪的事情。 Sed(与上面相同的命令)替换为一个文件而不是另一个我放置链接

replacable.html

unreplacable.html与1.html相同

为什么会这样。 sed能够在一个文件中替换ṣ而不能在另一个文件中替换。

2 个答案:

答案 0 :(得分:5)

您在html文件中组合了字符。也就是说,"ṣ"实际上是"s"后跟" ̣"(下面的组合点)。修复oneliner的一种可能性是:

perl -C -i -pe 's/s\x{0323}/s/g' "1.htm"

也就是说,在-C上打开stdout / stdin的utf8模式,然后在s///的左侧明确写出两个字符。

另一种可能性是使用Unicode::Normalize来标准化所有组合字符,例如:

perl -C -MUnicode::Normalize -Mutf8 -i -pe '$_=NFKC($_); s/ṣ/s/g' "1.htm"

但这也可以规范化输入文件中的所有其他字符,这对你来说可能也可能没有。

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed 's/\o341\o271\o243/s/g' file

要查找字符使用的seds八进制解释:

echo 'ṣ'| sed l

这会返回(对我来说):

\341\271\243$
ṣ

然后使用\onnn(或其组合)在替换命令的lefthandside(LFH)中找到正确的模式。

N.B。 \onnn也可以在替代命令的RHS中使用。