Is there a simple way to remove the same line of text from a folder full of text documents at the command line?
5 Answers
If your version of sed allows the -i.bak
flag (edit in place):
sed -i.bak '/line of text/d' *
If not, simply put it in a bash loop:
for file in *.txt
do
sed '/line of text/d' "$file" > "$file".new_file.txt
done

- 275,237
- 103
- 548
- 598

- 46,381
- 14
- 112
- 137
-
1+1 for the `-i.bak` gsed fu. Your `for loop` probably needs a `mv $file.new_file.txt $file` to match it. – nik Jul 25 '09 at 19:10
-
@Robert, If you miss the right sed, you can still do: `perl -pi.bak -e 's|line of text||g' \*` – nik Jul 25 '09 at 19:12
-
That leaves a blank line rather than deleting the line, right? – Ry4an Brase Jul 25 '09 at 19:12
-
@Ry4an, I guess you are right on that. There is a way to catch the end-of-line along with the text -- but, I can't recall that. – nik Jul 25 '09 at 19:15
-
do I have to use a backslash before any control characters? what are they? – Robert Jul 25 '09 at 19:19
-
5`$(ls *.txt)` is stupid (forks extra process, can't handle spaces in filenames). try `for file in *.txt` instead – hhaamu Jul 26 '09 at 15:36
-
1This failed for me if the folder had subdirectories. `sed -i '/foo/d' *.*` worked. – jake Nov 06 '14 at 17:21
-
This only does a single file in the folder, but not others. – Mark Locklear Oct 18 '19 at 12:41
To find a pattern
and remove the line containing the pattern
below command can be used
find . -name "*" -type f | xargs sed -i -e '/<PATTERN>/d'
Example :
if you want to remove the line containing word sleep
in all the xml
files
find . -name "*.xml" -type f | xargs sed -i -e '/sleep/d'
NOTE : Be careful before choosing a pattern as it will delete the line recursively in all the files in the current directory hierarchy :)
-
1This doesnt work if the folder path or filename contains spaces. – Syaiful Nizam Yahya Jan 02 '20 at 08:33
-
Consider grep -v:
for thefile in *.txt ; do
grep -v "text to remove" $thefile > $thefile.$$.tmp
mv $thefile.$$.tmp $thefile
done
Grep -v shows all lines except those that match, they go into a temp file, and then the tmpfile is moved back to the old file name.

- 78,112
- 7
- 148
- 169
perl -ni -e 'print if not /mystring/' *
This tells perl to loop over your file (-n), edit in place (-i), and print the line if it does not match your regular expression.
Somewhat related, here's a handy way to perform a substitution over several files.
perl -pi -e 's/something/other/' *

- 297,451
- 125
- 333
- 465
-
From this [link](http://www.kuro5hin.org/story/2009/3/9/191744/8407): both perl and sed are traditional NFA engines, so theoretically they shouldn't differ to greatly in their performance, but in reality perl has a large number of optimisations applied that make it perform well in common cases. – stephenmm Dec 13 '10 at 18:39
I wrote a Perl script for this:
#!/usr/bin/perl
use IO::Handle;
my $pat = shift(@ARGV) or
die("Usage: $0 pattern files\n");
die("Usage $0 pattern files\n")
unless @ARGV;
foreach my $file (@ARGV) {
my $io = new IO::Handle;
open($io, $file) or
die("Cannot read $file: $!\n");
my @file = <$io>;
close($io);
foreach my $line (@file) {
if($line =~ /$pat/o) {
$line = '';
$found = 1;
last;
}
}
if($found) {
open($io, ">$file") or
die("Cannot write $file: $!\n");
print $io @file;
close($io);
}
}
Note that it removes lines based on a regex. If you wanted to do exact match, the inner foreach
would look like:
foreach $line (@file) {
chomp $line;
if($line eq $pat) {
$line = '';
$found = 1;
last;
}
}

- 122,029
- 33
- 303
- 309