Czy istnieje prosty sposób na usunięcie tego samego wiersza tekstu z folderu pełnego dokumentów tekstowych w wierszu poleceń?Usuwanie linii tekstu z wielu plików w systemie Linux
Odpowiedz
Jeśli wersja sed umożliwia flagę -i.bak
(edycja na miejscu):
sed -i.bak '/line of text/d' *
Jeśli nie, wystarczy umieścić go w pętli bash
for file in *.txt
do
sed '/line of text/d' "$file" > "$file".new_file.txt
done
Napisałem skrypt Perl dla tego:
#!/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);
}
}
pamiętać, że usuwa linie oparte na regex. Jeśli chciał zrobić dokładne dopasowanie, wewnętrzna foreach
wyglądałby następująco:
foreach $line (@file) {
chomp $line;
if($line eq $pat) {
$line = '';
$found = 1;
last;
}
}
Rozważmy grep -v:
for thefile in *.txt ; do
grep -v "text to remove" $thefile > $thefile.$$.tmp
mv $thefile.$$.tmp $thefile
done
Grep -v pokazuje wszystkie wiersze z wyjątkiem pasujących, przechodzą one do pliku tymczasowego, a następnie plik tmp zostaje przeniesiony z powrotem do starej nazwy pliku.
perl -ni -e 'print if not /mystring/' *
Mówi perla do pętli na pliku (-n), edytować w miejscu (-i) i wydrukować wiersz, jeśli nie pasuje do wyrażenia regularnego.
Poniżej znajduje się przydatny sposób na zastąpienie kilku plików.
perl -pi -e 's/something/other/' *
Z tego [link] (http://www.kuro5hin.org/story/2009/3/9/191744/8407): zarówno perl jak i sed są tradycyjnymi silnikami NFA, więc teoretycznie nie powinny się one znacząco różnić w ich wydajność, ale w rzeczywistości perl ma wiele zastosowań optymalizacyjnych, które sprawiają, że działa dobrze w typowych przypadkach. – stephenmm
Aby znaleźć a pattern
i usunąć the line containing the pattern
poniżej komenda może być użyta
find . -name "*" -type f | xargs sed -i -e '/<PATTERN>/d'
Przykład: jeśli chcesz usunąć wiersz zawierający słowo sleep
we wszystkich xml
plików
find . -name "*.xml" -type f | xargs sed -i -e '/sleep/d'
UWAGA: Przed wybraniem wzoru należy zachować ostrożność, ponieważ spowoduje on rekursywne usunięcie linii pliki w bieżącej hierarchii katalogów :)
+1 dla pliku '-i.bak' gsed fu. Twoja 'pętla for' prawdopodobnie potrzebuje pliku' mv $ file.new_file.txt $ ', aby pasowało do niego. – nik
@Robert, Jeśli nie trafisz w sed, możesz jeszcze: 'perl -pi.bak -e 's | linia tekstu || g' \ *' – nik
To pozostawia pustą linię zamiast usuwania linii, prawda ? –