在 sed 替换中使用命令

在 sed 替换中使用命令

我试图使用 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/// 命令)才能正常工作。

相关内容