【发布时间】:2021-01-28 23:21:19
【问题描述】:
TL;DR 这是不可能的,因为“在运行 sed 之前,命令替换中的反向引用不是也不会由 sed 解析,而是由 shell 解析”(请参见下面的答案)。
我想用一个大文本文件 (>50MB) 中的相应字符替换国际音标的 unicode 值。
我的 test.txt 输入示例:
<CHARSET c="T">02C8;</CHARSET>ku:p<CHARSET c="T">0252;</CHARSET>n] noun<BR>
预期结果:
<CHARSET c="T">ˈ</CHARSET>ku:p<CHARSET c="T">ɒ</CHARSET>n] noun<BR>
我可以使用这个命令(例如)转换给定的 unicode:
echo -e "\u02C8"
但是我在 sed 命令中的转义失败了。我想到了从here 创建一个函数,如下所示:
codeToChar() { $( echo -e "\u$1"); }
sed -r -i 's#(<CHARSET c="T">)(....)#\1'"$(codeToChar \\2)"'#g' test.txt
但似乎 "\2" 反向引用没有传递给函数:
codeToChar() { $( echo -e "\u$1"); }
sed -r -i 's#(<CHARSET c="T">)(....)#\1'"$(codeToChar \\2)"'#g' test.txt
++ codeToChar '\2'
+++ echo -e '\u\2'
++ '\u\2'
./replace.sh: line 2: \u\2: command not found
+ sed -r -i 's#(<CHARSET c="T">)(....)#\1#g' test.tx
【问题讨论】:
-
我建议选择其他工具。像python,perl。
sed用于简单的流编辑器,它不像您可以根据行动态执行外部代码。抱歉,即使第一行codeToChar() { $( echo -e "\u$1"); }也是无效的 - 为什么要执行echo的执行结果?我相信重新阅读关于 shell 的良好介绍将有助于更好地理解 shell 的工作原理。 -
@KamilCuk:我想使用 echo 转换 Unicode 值。这是在这里建议的:code-examples.net/en/q/93320。我认为使用函数会使转义更容易。
-
是的,对于 one unicode 值。不适用于从文件中提取的某些模式,该模式匹配某些内容,然后替换为写回文件的值。这是编程语言的任务,而不是 sed。
标签: function sed escaping backreference