为什么这个 sed 命令无法捕获模式?

为什么这个 sed 命令无法捕获模式?

我想使用sedoneliner 在字符串周围放置一对括号。

这是我尝试过的

echo 1 | sed -e 's/.*/(\0)/'

我希望字母1与图案相匹配.*

然而输出只是

(0)

我其实想得到这样的结果:

(1)

sed我在 OSX 上使用 BSD

答案1

&是替代整个模式匹配的标准方法。一些sed实现(例如 GNU 或 busybox)支持\0作为替代方案,但这不是标准的,也不是可移植的。

$ echo 1 | sed -e 's/.*/(&)/'
(1)

该命令包含第一个(可能是空的)序列人物,每行括号内尽可能多。对于那些包含不形成有效字符的字节的行,这可能不会包含整行,在这种情况下,您可能会发现:

sed 's/^/(/; s/$/)/'

工作更可靠,封闭完整线括号内。

答案2

\1将引用第一个捕获组。由于您当前没有任何捕获组,因此您可以通过用大括号将匹配定义为捕获组,并使用以下命令引用它\1

$ echo 1 | sed 's/\(.*\)/(\1)/'
(1)

答案3

我已经通过下面的 awk 命令完成了

echo 1 | awk '{print "("$0")"}'

输出

(1)

相关内容