Replace whole line when match found with sed

ShellReplaceSedMatch

Shell Problem Overview


I need to replace the whole line with sed if it matches a pattern. For example if the line is 'one two six three four' and if 'six' is there, then the whole line should be replaced with 'fault'.

Shell Solutions


Solution 1 - Shell

You can do it with either of these:

sed 's/.*six.*/fault/' file     # check all lines
sed '/six/s/.*/fault/' file     # matched lines -> then remove

It gets the full line containing six and replaces it with fault.

Example:

$ cat file
six
asdf
one two six
one isix
boo
$ sed 's/.*six.*/fault/'  file
fault
asdf
fault
fault
boo

It is based on this solution to Replace whole line containing a string using Sed

More generally, you can use an expression sed '/match/s/.*/replacement/' file. This will perform the sed 's/match/replacement/' expression in those lines containing match. In your case this would be:

sed '/six/s/.*/fault/' file

> What if we have 'one two six eight eleven three four' and we want to > include 'eight' and 'eleven' as our "bad" words?

In this case we can use the -e for multiple conditions:

sed -e 's/.*six.*/fault/' -e 's/.*eight.*/fault/' file

and so on.

Or also:

sed '/eight/s/.*/XXXXX/; /eleven/s/.*/XXXX/' file

Solution 2 - Shell

Above answers worked fine for me, just mentioning an alternate way

Match single pattern and replace with a new one:

sed -i '/six/c fault' file

Match multiple pattern and replace with a new one(concatenating commands):

sed -i -e '/one/c fault' -e '/six/c fault' file

Solution 3 - Shell

To replace whole line containing a specified string with the content of that line

Text file:

Row: 0 last_time_contacted=0, display_name=Mozart, _id=100, phonebook_bucket_alt=2
Row: 1 last_time_contacted=0, display_name=Bach, _id=101, phonebook_bucket_alt=2

Single string:

$ sed 's/.* display_name=\([[:alpha:]]\+\).*/\1/'
output:
100
101

Multiple strings delimited by white-space:

$ sed 's/.* display_name=\([[:alpha:]]\+\).* _id=\([[:digit:]]\+\).*/\1 \2/'
output:
Mozart 100
Bach 101

Adjust regex to meet your needs

[:alpha] and [:digit:] are Character Classes and Bracket Expressions

Solution 4 - Shell

This might work for you (GNU sed):

sed -e '/six/{c\fault' -e ';d}' file

or:

sed '/six/{c\fault'$'\n'';d}' file

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionirekView Question on Stackoverflow
Solution 1 - ShellfedorquiView Answer on Stackoverflow
Solution 2 - ShellHasan RummanView Answer on Stackoverflow
Solution 3 - ShellThe MaulerView Answer on Stackoverflow
Solution 4 - ShellpotongView Answer on Stackoverflow