在 sed 替换中使用命令

Cho*_*hea 7 bash sed command-substitution

我正在尝试使用 sed 用该序列中的字符数量替换相同字符的序列,但不知何故出了问题。

我正在尝试以下操作:

echo aaabbdd | sed -e 's/a*/'"`wc -m &`/"
Run Code Online (Sandbox Code Playgroud)

但这会返回,0bbdd而我希望它返回3bbdd

我真的不知道到底出了什么问题 sed 似乎知道要替换什么并尝试执行 wc 命令,但不知何故 wc 将某些东西计算为空?我不知道如何解决这个问题,有人可以帮助我吗?

谢谢!

zep*_*lin 7

您试图实现的目标确实是可能的,但只能使用 GNU sed 并使用e命令。因此,如果您不介意可能出现的便携性问题,您可以尝试一下。

例如,您的示例将如下所示:

>echo aaabbdd | sed -e 's/a*/echo `echo -n & | wc -m`/;e'
3bbdd
Run Code Online (Sandbox Code Playgroud)

如果删除;e,您将看到一个中间命令(这有助于理解为什么有两个 echo'es)

echo `echo -n aaa | wc -m`bbdd
Run Code Online (Sandbox Code Playgroud)

如果您想替换多个匹配项,这可能会更棘手,但仍然可以通过链接替换来完成:

>echo aabbaadd | sed -re 's/a+/`echo -n &|wc -m`/g;s/.*/echo &/;e'
2bb2dd
Run Code Online (Sandbox Code Playgroud)

当然还有更好的工具可以满足您的任务,例如awk,它具有内置的length()函数。

参考:

聚苯乙烯

另请注意,如果您的输入数据包含引号,则必须小心地将它们转义,或临时替换它们(即使用 sed y/// 命令)才能使其正常工作。