我试图使用 sed 将相同字符的序列替换为该序列中的字符数量,但不知何故出了问题。
我正在尝试以下操作:
echo aaabbdd | sed -e 's/a*/'"`wc -m &`/"
但这会返回,0bbdd
而我希望它返回3bbdd
。
我真的不知道到底出了什么问题 sed 似乎知道要替换什么并尝试执行 wc 命令,但不知何故 wc 计数了一些空的东西?我不知道如何解决这个问题,有人可以帮助我吗?
谢谢你!
答案1
您想要实现的目标确实是可能的,但只能使用 GNU sed,使用e命令。因此,如果您不介意可能存在的可移植性问题,您可以尝试一下。
例如,您的示例将如下所示:
>echo aaabbdd | sed -e 's/a*/echo `echo -n & | wc -m`/;e'
3bbdd
如果你删除;e,您将看到一个中间命令(这有助于理解为什么有两个 echo'es)
echo `echo -n aaa | wc -m`bbdd
如果你想替换多个匹配,这可能会更棘手,但仍然可以通过链接替换来完成:
>echo aabbaadd | sed -re 's/a+/`echo -n &|wc -m`/g;s/.*/echo &/;e'
2bb2dd
当然,还有更好的工具可以完成您的任务,例如awk,其特点是内置长度()功能。
参考:
聚苯乙烯
另请注意,如果您的输入数据包含引号,则必须小心转义它们,或暂时替换它们(即使用 sed y/// 命令)才能正常工作。