我有一个文件1.htm。我想替换一个字母ṣ(带有以下点的s)。我尝试使用sed和perl,它不会替换。
sed -i 's/ṣ/s/g' "1.htm"
perl -i -pe 's/ṣ/s/g' "1.htm"
任何人都可以建议做什么
1.html(不替换ṣ)
此外,我发现了另一件奇怪的事情。 Sed(与上面相同的命令)替换为一个文件而不是另一个我放置链接
unreplacable.html与1.html相同
为什么会这样。 sed能够在一个文件中替换ṣ而不能在另一个文件中替换。
答案 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中使用。