Удалить строку текста из нескольких файлов в Linux - PullRequest
50 голосов
/ 25 июля 2009

Существует ли простой способ удалить ту же строку текста из папки, содержащей текстовые документы, в командной строке?

Ответы [ 5 ]

51 голосов
/ 25 июля 2009

Если ваша версия sed допускает флаг -i.bak (редактирование на месте):

sed -i.bak '/line of text/d' * 

Если нет, просто поместите его в цикл bash:

for file in *.txt
do
    sed '/line of text/d' "$file" > "$file".new_file.txt
done
24 голосов
/ 08 сентября 2016

Для поиска 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'

ПРИМЕЧАНИЕ. Будьте внимательны перед выбором шаблона, поскольку он будет рекурсивно удалять строку во всех файлах в текущей иерархии каталогов :)

4 голосов
/ 25 июля 2009
perl -ni -e 'print if not /mystring/' *

Это говорит Perl циклически перебирать ваш файл (-n), редактировать на месте (-i) и печатать строку, если она не соответствует вашему регулярному выражению.

В некотором роде, вотудобный способ замены нескольких файлов.

perl -pi -e 's/something/other/' *
4 голосов
/ 25 июля 2009

Рассмотрим grep -v:

for thefile in *.txt ; do
   grep -v "text to remove" $thefile > $thefile.$$.tmp
   mv $thefile.$$.tmp $thefile
done

Grep -v показывает все строки, кроме совпадающих, они идут во временный файл, а затем tmpfile перемещается обратно к старому имени файла.

1 голос
/ 25 июля 2009

Я написал для этого скрипт на Perl:

#!/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;
    }
}
...