为什么 sed 不在匹配后替换?

为什么 sed 不在匹配后替换?

我有一个名为 text.csv 的文件,其内容如下所述

10 个小脚趾

这是ThaT

5 有趣 0

一二三

树两次

我试图通过用括号括起来来替换数字,因此预期输出是

(1)(0) 小脚趾

这是ThaT

(5) 搞笑 (0)

一二三

树两次

我使用 sed 命令作为

sed 's/[0-9]/(&)/g' text.csv

然后它得到正确的输出,但后来我尝试给出以下内容

sed 's/[0-9]*/(&)/g' text.csv

然后它给出以下输出。

(10) ()T()i()n()y()()T()o()e()s()

()T()h()i()s() ()i()s() ()T()h()a()T()

(5) ()f()u()n()n()y() (0)

()一二三()

()T()r()e()e() ()T()w()i()c()e()

因此,* 的存在意味着应该搜索紧邻的前一个字符并将其替换为 (&),但这种情况并未发生。使用 * 进行搜索我哪里错了。

答案1

x*表示任意序列0或更多xes。它是 的缩写x\{0,\}。所以它也匹配空字符串。匹配于1或更多,\{1,\}如果您启用扩展正则表达式-E(仅某些sed实现)可以缩短为+.

请注意,通常意味着在字符和字符[0-9]之间排序的任何整理元素,这取决于语言环境、操作系统或实现,并不意味着仅。09sed0123456789

所以:

sed 's/[0123456789]\{1,\}/(&)/g'

或者:

sed -E 's/[0123456789]+/(&)/g'

相关内容