Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash sed-r(例如echo“aa”sed-r';s/o*/#ug/g';)_Bash_Sed - Fatal编程技术网

Bash sed-r(例如echo“aa”sed-r';s/o*/#ug/g';)

Bash sed-r(例如echo“aa”sed-r';s/o*/#ug/g';),bash,sed,Bash,Sed,我在终端上尝试了下面的命令 echo“aa”| sed-r's/o*/\ug' 结果是这样的 \u a\u a 我所期望的是 \u 当读取第一个a时,这意味着有零个o,因此a将被\ucode>替换 如果我使用 echo“aoooa”| sed-r's/o+/\ug' 结果和我预料的一样 a\u a 但是当我使用 echo“aoooa”sed-r/s/o*/\ug 结果是 \u a\u a 我认为应该是\u a\u a,没有最后一个\u 我完全不知道为什么会有3个下划线。有人能告诉我这个特定案例的

我在终端上尝试了下面的命令
echo“aa”| sed-r's/o*/\ug'

结果是这样的
\u a\u a

我所期望的是
\u
当读取第一个
a
时,这意味着有零个
o
,因此
a
将被
\ucode>替换

如果我使用
echo“aoooa”| sed-r's/o+/\ug'

结果和我预料的一样
a\u a

但是当我使用
echo“aoooa”sed-r/s/o*/\ug

结果是
\u a\u a

我认为应该是
\u a\u a
,没有最后一个
\u


我完全不知道为什么会有3个下划线。有人能告诉我这个特定案例的运行过程吗?

如果所需的输出是以o开头的,并且下划线不是o,则可以使用:

 echo "abcdefhijklmnopqrstuvwxyzoo" | sed -r 's/[^o]/_/g'         

输出:uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuo

[来自我的评论:
o*
与“a”不匹配,它与“a”之前的零长字符串匹配(与“a”之间的零长字符串和第二个“a”之后的零长字符串匹配)。“a”标志着比赛的结束,但它不是比赛的一部分,因此不会被替换

为了使这更清楚,考虑当“O”的运行(和我用资本“A使它们更可见”)时会发生什么:

…每组“o”将替换为一个“u”;“A”结束前两组,但他们不是组的一部分(他们在组之间),所以他们被单独留下

如果一组中只有一个“o”,同样的情况也会发生:

$ echo "oAoAo" | sed 's/o*/_/g'
_A_A_
…最后,在没有“o”的情况下(即“o”的零长度组):


…同样,“A”不是匹配的一部分,因此它们不会被替换。

请编辑您的Q以显示您所期望的输出。回想一下,
*
表示前面的文本对象的零个或多个,强调零个或多个。当然,你为什么希望
s/o/g
改变
a
(或者
l
,就像你的主题行那样)?祝你好运。当它读取第一个
a
时,我认为条件
o*
已经满足,因为没有
o
a
将被
替换,如果你试图用“\ucode>sed”s/a/\ug“
替换“a”就足够了。如果你想替换任何字母(a-z),那么你可以使用
's/[a-z]/\ug'
那么你能为我解释一下这个命令吗
echo“aoooa”| sed's/[o]*/\ug'
结果是
\u a\u
为什么有3个下划线?@DuongHoang
o*
与“a”不匹配,它与“a”之前的零长字符串匹配(以及“a”之间的零长字符串和第二个“a”之后的零长字符串。)“a”表示匹配结束,但它不是匹配的一部分,因此不会被替换。
$ echo "oAoAo" | sed 's/o*/_/g'
_A_A_
$ echo "AA" | sed 's/o*/_/g'
_A_A_