Home > Enterprise >  What is the global flag for in sed?
What is the global flag for in sed?

Time:07-21

I've come to know the global (/g) flag to mean the action should take place globally in a file.

If I want to replace all instances of "hello world" with "goodbye space", I would add /g on the end of the statement.

That makes sense. However...

I was writing a sed replace command and noticed that even if I didn't include /g it would still replace all instances in a file. Below is the contents of my .txt file:

hello there
how is life
today is over
today is over
don't be sad
today is over
tomorrow is a new day

Now, I want to file all of these "today is over" lines and replace them with "tomorrow will begin". Therefore, I wrote the below code:

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

sed -i "" "s/$LINE/tomorrow will begin/" $YOUR_FILE

Despite NOT including the global flag at the end, it still replaces all instances of today is over with tomorrow will begin.

Can someone explain this behavior to me as I haven't been able to find anything about it. Why does it replace all instances even when I omit the /g part at the end?

Alternatively, if I wanted to only remove the first instance, how would I go about specifying that?

I am doing this on a Mac.

CodePudding user response:

The global flag allows sed to replace multiple matches in the same line.

$ echo 'world world' > somefile
$ sed 's/world/hello/' somefile
hello world
$ sed 's/world/hello/g' somefile
hello hello
  • Related