0

当使用带或不带全局g选项的管道时,结果相同:

echo -e 'hi\nhello\nhi' | sed '1s/hi/hey/g'
hey
hello
hi

不使用全局g选项时也适用于此处字符串:

sed '1s/hi/hey/' <<< $(echo -e 'hi\nhello\nhi')
hey hello hi

但是当使用全局g选项和here-string替换每一行的模式时:

sed '1s/hi/hey/g' <<< $(echo -e 'hi\nhello\nhi')
hey hello hey

为什么在使用全局替换标志和输入来自这里字符串时输出会发生这种变化?

4

1 回答 1

3

sed它与脚本没有多大关系,与bash这里的字符串表示法和引号有很大关系。使用cat代替,sed你会看到:

$ echo -e 'hi\nhello\nhi' | cat
hi
hello
hi
$ cat <<< $(echo -e 'hi\nhello\nhi')
hi hello hi
$ cat <<< "$(echo -e 'hi\nhello\nhi')"
hi
hello
hi
$

因此,您可以看到,使用未引用的 here-string,您可以在一行中获得三个单词。命令上的g修饰符意味着在输入的第一行出现的两个 都被更改。在没有修饰符的情况下,只有第一行的第一次出现被更改。第三行永远不会被修改,因为in将更改限制在输入的第一行。sed1s/hi/hey/ghig11s/hi/hey/

这也解释了 3 行与 1 行的输出。

于 2020-09-17T17:28:07.400 回答