Hur använder jag sed för att radera alla rader i en textfil som innehåller en viss sträng?
För att ta bort raden och skriva ut utdata till standard out:
sed '/pattern to match/d' ./infile
För att ändra filen direkt - fungerar inte med BSD sed:
sed -i '/pattern to match/d' ./infile
Samma sak, men för BSD sed (Mac OS X och FreeBSD) - fungerar inte med GNU sed:
sed -i '' '/pattern to match/d' ./infile
För att ändra filen direkt (och skapa en säkerhetskopia) - fungerar med BSD och GNU sed:
sed -i.bak '/pattern to match/d' ./infile
Det finns många andra sätt att radera rader med specifika strängar än 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
Och naturligtvis sed
(det går snabbare att skriva ut den inversa delen än att radera):
sed -n '/pattern/!p' file
Du kan använda sed för att ersätta rader på plats i en fil. Det verkar dock vara mycket långsammare än att använda grep för att göra en invers översättning till en andra fil och sedan flytta den andra filen över den ursprungliga.
t.ex.
sed -i '/pattern/d' filename
eller
grep -v "pattern" filename > filename2; mv filename2 filename
Det första kommandot tar ändå tre gånger längre tid på min maskin.