This tutorial is about how to replace the pattern with sed command in the same file you are reading from.
What is sed?
Sed stands for stream editor, as per the Linux man page.
But sed is more than it. We can write more powerful bash scripts with just a single line using sed. It can be used for fetching specific lines, a bunch of lines, replace the character with patterns and so much. Basically, just manipulate the stream of characters with whatever logic you projectile
Let’s get started,
We understand more with the task in hand. So, our task for this tutorial is to replace some characters with our characters.
Suppose we have a file like content below,
304 PULSEaudio -k 306 PULSEaudio --cleanup-shm 310 PULSEaudio --check 311 PULSEaudio --start 312 PULSEaudio --kill 322 PULSEaudio -k 323 PULSEaudio --check 324 killall PULSEaudio 325 PULSEaudio --check 331 ls * | grep -e PULSE 332 cd PULSE/ 340 PULSEaudio -k 344 PULSEaudio -D 345 PULSEaudio -d 346 service PULSEaudio status 348 ps -eo "user args" | grep PULSE 350 ps -eo "user args" | grep PULSE 351 PULSEaudio -k 352 killall PULSEaudio
And we are supposed to replace the characters PULSE to pulse.
Either, we can open this file in VIM and type command like
If you are familiar with vim. You’ll know what I am talking about
But if you are using this output for some reason in your bash script, you need to do this with a single command.
Here comes our savior sed.
sed s/pattern/replace_char/ <file_name>
This command does our task, but the problem is it gives output on stdout.
Common error:- we generally try to redirect that output to the file we are editing
If we are editing the file named replace.txt then the command will be
sed s/PULSE/pulse/ replace.txt 2> replace.txt
But sed creates a problem here. It doesn’t work that way it’s not sed’s problem, Its problem with the order of file descriptors it set.
This is a common error, we want to modify a file using something that reads from a file and writes the result to
stdout. To do this, we redirect stdout to the file we want to modify. The problem here is that, as we have seen, the redirections are setup before the command is actually executed.
So BEFORE sed starts, standard output has already been redirected, with the additional side effect that, because we used >, “file” gets truncated. When
sedstarts to read the file, it contains nothing
( if you don’t know what it is read this link https://wiki.bash-hackers.org/howto/redirection_tutorial ).
Sed added one feature which internally sets this redirection of a file descriptor for us. Use -i option to overcome this problem.
The final command will be
sed s/PULSE/pulse/ replace.txt -i