3

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

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

任何人都可以建议做什么

1.html(不替换ṣ)

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

可替换的.html

unreplacable.html与 1.html 相同

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

4

2 回答 2

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"

但这也会规范输入文件中的所有其他字符,这对您来说可能合适,也可能不合适。

于 2013-10-19T08:24:37.840 回答
0

这可能对您有用(GNU sed):

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

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

echo 'ṣ'| sed l

这返回(对我来说):

\341\271\243$
ṣ

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

NB\onnn也可以用在替代命令的 RHS 中。

于 2013-10-20T09:42:29.100 回答