Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combining two sed commands

Tags:

sed

I have a file r. I want to replace the words File and MINvac.pdb in it with nothing. The commands I used are

sed -i 's/File//g' /home/kanika/standard_minimizer_prosee/r 

and

sed -i 's/MINvac.pdb//g' /home/kanika/standard_minimizer_prosee/r 

I want to combine both sed commands into one, but I don't know the way. Can anyone help?

The file looks like this:

-6174.27    File10MINvac.pdb -514.451    File11MINvac.pdb 4065.68     File12MINvac.pdb -4708.64    File13MINvac.pdb 6674.54     File14MINvac.pdb 8563.58     File15MINvac.pdb 
like image 886
kanika Avatar asked Oct 05 '11 06:10

kanika


People also ask

How do I combine two sed commands?

You separate commands with semicolon or newline. Many sed dialects also allow you to pass each command as a separate -e option argument. I also added a backslash to properly quote the literal dot before pdb , but in this limited context that is probably unimportant. For completeness, here is the newline variant.

How do I combine two commands in Linux?

Concatenate Commands With “&&“ The “&&” or AND operator executes the second command only if the preceding command succeeds.

What is sed '$ d?

Delete last line or footer line or trailer line The following sed command is used to remove the footer line in a file. The $ indicates the last line of a file. > sed '$d' file.

How do I use multiple in bash?

To run multiple commands in a single step from the shell, you can type them on one line and separate them with semicolons. This is a Bash script!! The pwd command runs first, displaying the current working directory, then the whoami command runs to show the currently logged in users.


2 Answers

sed is a scripting language. You separate commands with semicolon or newline. Many sed dialects also allow you to pass each command as a separate -e option argument.

sed -i 's/File//g;s/MINvac\.pdb//g' /home/kanika/standard_minimizer_prosee/r 

I also added a backslash to properly quote the literal dot before pdb, but in this limited context that is probably unimportant.

For completeness, here is the newline variant. Many newcomers are baffled that the shell allows literal newlines in quoted strings, but it can be convenient.

sed -i 's/File//g     s/MINvac\.pdb//g' /home/kanika/standard_minimizer_prosee/r 

Of course, in this limited case, you could also combine everything into one regex:

sed -i 's/\(File\|MINvac\.pdb\)//g' /home/kanika/standard_minimizer_prosee/r 

(Some sed dialects will want this without backslashes, and/or offer an option to use extended regular expressions, where they should be omitted. BSD sed, and thus also MacOS sed, demands a mandatory argument to sed -i which can however be empty, like sed -i ''.)

like image 156
tripleee Avatar answered Oct 04 '22 07:10

tripleee


Use the -e flag:

sed -i -e 's/File//g' -e 's/MINvac.pdb//g' /home/kanika/standard_minimizer_prosee/r 

Once you get more commands than are convenient to define with -es, it is better to store the commands in a separate file and include it with the -f flag.

In this case, you'd make a file containing:

s/File//g s/MINvac.pdb//g 

Let's call that file 'sedcommands'. You'd then use it with sed like this:

sed -i -f sedcommands /home/kanika/standard_minimizer_prosee/r 

With only two commands, it's probably not worthwhile using a separate file of commands, but it is quite convenient if you have a lot of transformations to make.

like image 37
Michael J. Barber Avatar answered Oct 04 '22 06:10

Michael J. Barber