Διαγραφή γραμμών σε ένα αρχείο κειμένου που περιέχουν μια συγκεκριμένη συμβολοσειρά

Πώς μπορώ να χρησιμοποιήσω το sed για να διαγράψω όλες τις γραμμές ενός αρχείου κειμένου που περιέχουν μια συγκεκριμένη συμβολοσειρά;

Λύση

Για να αφαιρέσετε τη γραμμή και να εκτυπώσετε την έξοδο στην τυπική έξοδο:

sed '/pattern to match/d' ./infile

Για να τροποποιήσετε απευθείας το αρχείο - δεν λειτουργεί με το BSD sed:

sed -i '/pattern to match/d' ./infile

Το ίδιο, αλλά για BSD sed (Mac OS X και FreeBSD) - δεν λειτουργεί με το GNU sed:

sed -i '' '/pattern to match/d' ./infile

Για να τροποποιήσετε απευθείας το αρχείο (και να δημιουργήσετε ένα αντίγραφο ασφαλείας) - λειτουργεί με BSD και GNU sed:

sed -i.bak '/pattern to match/d' ./infile
Σχόλια (25)

Υπάρχουν πολλοί άλλοι τρόποι για να διαγράψετε γραμμές με συγκεκριμένη συμβολοσειρά εκτός από το sed:

AWK

awk '!/pattern/' file > temp && mv temp file

Ruby (1.9+)

ruby -i.bak -ne 'print if not /test/' file

Perl

perl -ni.bak -e "print unless /pattern/" file

Shell (bash 3.2 και νεότερη έκδοση)

while read -r line
do
  [[ ! $line =~ pattern ]] && echo "$line"
done  o
mv o file

GNU grep

grep -v "pattern" file > temp && mv temp file

Και φυσικά sed (η εκτύπωση του αντιστρόφου είναι ταχύτερη από την πραγματική διαγραφή):

sed -n '/pattern/!p' file
Σχόλια (7)

Μπορείτε να χρησιμοποιήσετε το sed για να αντικαταστήσετε γραμμές στη θέση τους σε ένα αρχείο. Ωστόσο, φαίνεται να είναι πολύ πιο αργή από το να χρησιμοποιήσετε το grep για την αντιστροφή σε ένα δεύτερο αρχείο και στη συνέχεια να μετακινήσετε το δεύτερο αρχείο πάνω από το αρχικό.

π.χ.

sed -i '/pattern/d' filename      

ή

grep -v "pattern" filename > filename2; mv filename2 filename

Η πρώτη εντολή διαρκεί 3 φορές περισσότερο στο δικό μου μηχάνημα ούτως ή άλλως.

Σχόλια (9)