How to remove lines from the text file containing specific words through terminal?
grep
approach
To create a copy of the file without lines matching "cat" or "rat", one can use grep
in reverse (-v
) and with the whole-word option (-w
).
grep -vwE "(cat|rat)" sourcefile > destinationfile
The whole-word option makes sure it won't match cats
or grateful
for example. Output redirection of your shell is used (>
) to write it to a new file. We need the -E
option to enable the extended regular expressions for the (one|other)
syntax.
sed
approach
Alternatively, to remove the lines in-place one can use sed -i
:
sed -i "/\b\(cat\|rat\)\b/d" filename
The \b
sets word boundaries and the d
operation deletes the line matching the expression between the forward slashes. cat
and rat
are both being matched by the (one|other)
syntax we apparently need to escape with backslashes.
Tip: use sed
without the -i
operator to test the output of the command before overwriting the file.
(Based on Sed - Delete a line containing a specific string)
To test in terminal only, use:
sed '/[cr]at/d' file_name
To really remove those lines from the file, use:
sed -i '/[cr]at/d' file_name
Try using ex
command (part of Vi/Vim):
ex +"g/[cr]at/d" -scwq file.txt
The above has the advantage over other tools such as sed
due to its non-standard FreeBSD -i
(in-place) extension and may not be available on other operating systems. Secondly sed
is a Stream EDitor, not a file editor.