0

I have a String

/abc/gef        \*(cse,fff)

to delete from a file,have to match the full string pattern,tried with

sed -i '//abc/gef        \*(cse,fff)/d' filename

but this ends in an error:

sed: -e expression #1, char xx: expected newer version of sed

I also tried the following options but didn't work:

sed -i '/\/abc\/gef        \*(cse,fff)/d' filename
sed -i 's|/abc/gef        \*(cse,fff)||g' filename

What is the right command for this?

2
  • I am able to execute upto below expreseeion sed -i '/\/abc\/gef \*/d' filename BUT when i include "(" like --- sed -i '/\/var\/nfs \*(cse,fff)/d' filename it's not deleting Commented Dec 3, 2020 at 10:59
  • how to escape the "(" and ")" ? DO i need to escape "," also Commented Dec 3, 2020 at 11:07

3 Answers 3

2

The following works with GNU sed versions 4.5 and 4.7 and will delete any lines that contain the string:

sed '/\/abc\/gef        \\\*(cse,fff)/d' file

You have to use \ to escape the two instances of / in the string so that they aren't taken as the delimiter and * which otherwise expands to the character before it which is f. The latter will cause it not to match the string.

You can also use the s option which allows other characters as a delimiter if you only want to delete the string itself throughout the file and not the entire line:

sed 's|/abc/gef        \\\*(cse,fff)||g' file

That uses | as a delimiter so that you don't have to escape /.

To edit the file in place after you're sure that it does what you want, you can use -i like you have above:

sed -i '/\/abc\/gef        \\\*(cse,fff)/d' file

sed -i 's|/abc/gef        \\\*(cse,fff)||g' file

EDIT: I have updated the answer as the string in the question is different from what it was when originally posted.

7
  • You may also use almost any other character as a delimiter in the s command, getting rid of the need for escaping the slashes. Commented Dec 3, 2020 at 8:58
  • IT's not giving the error but not deleting from the file the exact string to delete --- /abc/gef *(cse,fff) after gef 4,5 blankspaces are present but it's not showing here Commented Dec 3, 2020 at 9:13
  • The /.../d version deletes the entire line that contains the string, though, not just the string. Commented Dec 3, 2020 at 9:16
  • yes I want to delete the entire line Commented Dec 3, 2020 at 9:22
  • Tried with below options but didn't work--- sed -i '/\/abc\/gef *(cse,fff)/d' filename sed -i 's|/var/nfs *(cse,fff)||g' filename Commented Dec 3, 2020 at 9:28
1

The problem is that both \ (escape character) and * (0 or more) have a special meaning in regular expressions, so you need to escape them in order to use them as literal characters. Now, the way to escape something is to add a \ before it. So, in order for * to match a literal asterisk and not mean "0 or more", you would write \*. Similarly, to escape the \ you would write \\. Putting this together, we have:

$ cat file 
foo
bar
/abc/gef        \*(cse,fff)
baz

And:

$ sed '/\/abc\/gef        \\\*(cse,fff)/d' file 
foo
bar
baz

Note how I have also escaped the / since // is the match operator in sed. This is why we have /\/abc\/gef and not //abc/gef. The d at the end means "delete any line matching this pattern".

0
1

This sounds like a job for grep:

$ cat file
line 1
line 2
/abc/gef        *(cse,fff)
line 4

$ grep -Fxv '/abc/gef        *(cse,fff)' file
line 1
line 2
line 4
1
  • Thanks a lot Glenn Commented Dec 3, 2020 at 15:24

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.