Есть ли простой способ удалить одну и ту же строку текста из папки, полной текстовых документов в командной строке?
Удалить строку текста из нескольких файлов в Linux
Ответ 1
Если ваша версия sed позволяет -i.bak
flag (редактировать на месте):
sed -i.bak '/line of text/d' *
Если нет, просто поставьте его в цикл bash:
for file in *.txt
do
sed '/line of text/d' "$file" > "$file".new_file.txt
done
Ответ 2
Чтобы найти a pattern
и удалить the line containing the pattern
ниже, можно использовать команду
find . -name "*" -type f | xargs sed -i -e '/<PATTERN>/d'
Пример:
если вы хотите удалить строку, содержащую слово sleep
во всех файлах xml
find . -name "*.xml" -type f | xargs sed -i -e '/sleep/d'
ПРИМЕЧАНИЕ. Будьте осторожны, прежде чем выбирать шаблон, поскольку он будет рекурсивно удалять строку во всех файлах в текущей иерархии каталогов.
Ответ 3
Рассмотрим grep -v:
for thefile in *.txt ; do
grep -v "text to remove" $thefile > $thefile.$$.tmp
mv $thefile.$$.tmp $thefile
done
Grep -v показывает все строки, кроме тех, которые соответствуют, они входят в временный файл, а затем tmpfile возвращается к старому имени файла.
Ответ 4
perl -ni -e 'print if not /mystring/' *
Это указывает perl на цикл над вашим файлом (-n), редактировать на месте (-i) и печатать строку, если она не соответствует вашему регулярному выражению.
В некотором роде, здесь удобный способ выполнить замену над несколькими файлами.
perl -pi -e 's/something/other/' *
Ответ 5
Я написал Perl script для этого:
#!/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);
}
}
Обратите внимание, что он удаляет строки на основе регулярного выражения. Если вы хотите сделать точное совпадение, внутренний foreach
будет выглядеть так:
foreach $line (@file) {
chomp $line;
if($line eq $pat) {
$line = '';
$found = 1;
last;
}
}