Πώς μπορώ να χρησιμοποιήσω το 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
Υπάρχουν πολλοί άλλοι τρόποι για να διαγράψετε γραμμές με συγκεκριμένη συμβολοσειρά εκτός από το sed
:
awk '!/pattern/' file > temp && mv temp file
ruby -i.bak -ne 'print if not /test/' file
perl -ni.bak -e "print unless /pattern/" file
while read -r line
do
[[ ! $line =~ pattern ]] && echo "$line"
done <file > o
mv o file
grep -v "pattern" file > temp && mv temp file
Και φυσικά sed
(η εκτύπωση του αντιστρόφου είναι ταχύτερη από την πραγματική διαγραφή):
sed -n '/pattern/!p' file
Μπορείτε να χρησιμοποιήσετε το sed για να αντικαταστήσετε γραμμές στη θέση τους σε ένα αρχείο. Ωστόσο, φαίνεται να είναι πολύ πιο αργή από το να χρησιμοποιήσετε το grep για την αντιστροφή σε ένα δεύτερο αρχείο και στη συνέχεια να μετακινήσετε το δεύτερο αρχείο πάνω από το αρχικό.
π.χ.
sed -i '/pattern/d' filename
ή
grep -v "pattern" filename > filename2; mv filename2 filename
Η πρώτη εντολή διαρκεί 3 φορές περισσότερο στο δικό μου μηχάνημα ούτως ή άλλως.