Finding and deleting lines from all files recursively

14

10

I have managed to grep the occurences of a keyword by using

grep "KeyWord" . -r -n -i -I 

but, the occurences of the KeyWord are too large. I just want to delete all the lines containing that word.

I searched around, sed looks like to be the utility. Can anyone tell me what command would do the trick?

Thanks.

SurenNihalani

Posted 2012-07-06T00:26:13.963

Reputation: 599

Answers

25

With a GNU sed:

find . -type f -print0 | xargs -0 sed -i /KeyWord/d

With an OSX sed:

find . -type f -print0 | xargs -0 sed -i '' /KeyWord/d

First command find finds all the standard files (not directories, or pipes, or etc.), prints them separated by \0 (so filenames can contains spaces, newlines, etc.).

Second command xargs reads the output of find, grabs a list based on a separator (\0 because of -0), invokes sed -i [...] with added parameters from the list (sed will be called multiple times if there are a lot of files, as the maximum length of the parameters is limited in each invocation).

The sed command modifies in-place (-i).

As to /KeyWord/d, it'll delete lines containing the regular expression KeyWord.

You should learn sed to properly understand the (simple but unusual) syntax, and refer to the appropriate manpages for more information about the tools involved here.


And as I like to promote zsh, the solution with its extended globs:

sed -i /KeyWord/d **/*(.)

Pierre Carrier

Posted 2012-07-06T00:26:13.963

Reputation: 896

How about just deleting the word "keyword." and not the whole line? – SurenNihalani – 2012-07-11T23:39:43.413

s/KeyWord//g (substitutes KeyWord with '' (empty string), g for all (not only the first on each line). – Pierre Carrier – 2012-07-15T17:23:45.483

1

You can use Vim in Ex mode:

find -type f -exec ex -sc g/KeyWord/d -cx {} ';'
  1. g global search

  2. d delete

  3. x save and close

Steven Penny

Posted 2012-07-06T00:26:13.963

Reputation: 7 294

in OSX that gave me find: illegal option -- t , had to add the .

find . -type f -exec ex -sc g/KeyWord/d -cx {} ';' – Erik – 2016-08-28T07:00:47.320