Skip to content
Advertisement

How can I fix the following sed command?

I am trying to append _out to anything that matches the regex shown in the follwing sed command. The _out should be before the [ (].

sed -n '/[^_]lm[01?]_.*[ (]/p'

The command returns the lines correctly as I expect. Now the problem comes when I try the following command where I define regions to use in the replacement.

So for example if I have a match of lm?_whatever( it should be replaced by lm?_whatever_out(.

I used

sed 's/([^_]lm[01?]_.*)([ (])/1_out2/g' text_to_edit

And as you might guess I was unlucky. What am I doing wrong?

EDIT:

Here is an example explaining more:

The text:

this will make absolutely no sense=lm?_hello <= four_lm1_hi(5:0) bla bla
lm1_blabbering(5:0) 

should turn into

this will make absolutely no sense=lm?_hello_out <= four_lm1_hi(5:0) bla bla
lm1_blabbering_out(5:0) 

Advertisement

Answer

In order to only match your lm words and not affect the following ones, you need to restrict the pattern. I suggest turning .* to [^[:blank:]]* to match 0 or more characters other than spaces or tabs:

sed 's/([^_]lm[01?]_[^[:blank:]]*)([ (])/1_out2/g' text_to_edit

(EDIT) Or, if the only characters there are between _ and are alphanumeric characters, you may use [[:alnum:]] character class:

sed 's/([^_]lm[01?]_[[:alnum:]_]*)(.)/1_out2/g' text_to_edit

This way, we’ll make sure only the lm?_hello and lm1_blabbering are matched.

Advertisement