sed 中的全局标志是什么?

Mat*_*oak 2 macos bash shell sed

我开始了解全局 ( /g) 标志,这意味着该操作应该在文件中全局发生。

如果我想用“再见空间”替换“hello world”的所有实例,我会/g在语句末尾添加。

这就说得通了。然而...

我正在编写一个sed替换命令,并注意到即使我不包含/g它,它仍然会替换文件中的所有实例。以下是我的文件的内容.txt

hello there
how is life
today is over
today is over
don't be sad
today is over
tomorrow is a new day
Run Code Online (Sandbox Code Playgroud)

现在,我想归档所有这些“今天结束”行,并将它们替换为“明天将开始”。因此,我编写了以下代码:

YOUR_FILE='testing.txt'
LINE="today is over"

sed -i "" "s/$LINE/tomorrow will begin/" $YOUR_FILE
Run Code Online (Sandbox Code Playgroud)

尽管末尾不包含全局标志,但它仍然用 替换所有today is over实例tomorrow will begin

有人可以向我解释这种行为吗,因为我还没有找到任何相关信息。为什么即使我省略了/g最后的部分,它也会替换所有实例?

或者,如果我只想删除第一个实例,我将如何指定它?

我正在 Mac 上执行此操作。

jir*_*mok 7

全局标志允许 sed 替换同一行中的多个匹配项。

$ echo 'world world' > somefile
$ sed 's/world/hello/' somefile
hello world
$ sed 's/world/hello/g' somefile
hello hello
Run Code Online (Sandbox Code Playgroud)