Bekijk Volledige Versie : Lijnen verwijderen die een bepaalde text bevatten
GuusDeGraeve
22/10/08, 10:18
Hoi,
We hebben een heel groot aantal bestanden waarin we lijnen willen verwijderen die een bepaalde tekst bevatten.
Stel nu voor dat we 1000en bestanden hebben, en in die bestanden zitten enkele lijnen waarin bijvoorbeeld de tekst "foobar" voorkomt. Hoe kunnen we die lijnen dan verwijderen uit deze bestanden?
Ik heb al zitten testen met sed/awk/perl maar vind precies niet de parameters die ik nodig heb voor deze commands. Er loopt altijd wel iets fout :)
Alvast bedankt!
grappig, ik ben opzoek naar bijna hetzelfde, maar dan vervangen ipv verwijderen :p
zullen we dat maar in hetzelfde topic doen dan?
systemdeveloper
22/10/08, 10:27
perl -pi.bak -e 's/oudetekst/nieuwetekst/g' bestanden.ext
Dit maakt een copie van de bestanden met een .bak extentie en wijzigt die tekst in het originele bestand.
GuusDeGraeve
22/10/08, 10:33
perl -pi.bak -e 's/oudetekst/nieuwetekst/g' bestanden.ext
Dit maakt een copie van de bestanden met een .bak extentie en wijzigt die tekst in het originele bestand.
Hiermee kan ik jammer genoeg niet echt iets doen, in mijn geval moet hij de volledige lijnen echt verwijderen. Het moet ook in het bestand zelf worden aangepast, niet via een bak file dus. Ik vermoed dat dit enkel de '.bak' uit het commando weghalen is?
Iemand die iets weet om die volledige lijnen te verwijderen?
mv file.txt tmpfile.txt
grep -v "foobar" tmpfile.txt > file.txt
rm file.txt
Je werkt dus wel met een tijdelijke file, maar daar kom je volgens mij niet onderuit. Als je namelijk gelijk terug schrijft naar het bronbestand, hou je alleen de eerste regel over :)
GuusDeGraeve
22/10/08, 11:00
mv file.txt tmpfile.txt
grep -v "foobar" tmpfile.txt > file.txt
rm file.txt
Je werkt dus wel met een tijdelijke file, maar daar kom je volgens mij niet onderuit. Als je namelijk gelijk terug schrijft naar het bronbestand, hou je alleen de eerste regel over :)
En moet ik dit voor de 1000en bestanden doen die in mijn dir staan? :)
Lijnen? Regels bedoel je? Ik snapte er werkelijk geen moer van.
GuusDeGraeve
22/10/08, 11:08
Lijnen? Regels bedoel je? Ik snapte er werkelijk geen moer van.
Ja regels bedoel ik :) sorry.
Volgens mij, maar mijn linux shell scripting is niet zo geweldig, kom je dan uit op iets als het volgende:
for file in $(ls); do
mv $file tmpfile.txt
grep -v "foobar" tmpfile.txt > $file
rm tmpfile.txt
done
Uiteraard wel zelf testen voor je het op je live bestanden los laat.
systemdeveloper
22/10/08, 11:46
Hiermee kan ik jammer genoeg niet echt iets doen, in mijn geval moet hij de volledige lijnen echt verwijderen. Het moet ook in het bestand zelf worden aangepast, niet via een bak file dus. Ik vermoed dat dit enkel de '.bak' uit het commando weghalen is?
Iemand die iets weet om die volledige lijnen te verwijderen?
Zoals ik dus zei....
server32# cat test.ext1
regel 1
regel 2
regel 3
regel 4
server32# perl -pi.bak -e 's/regel 3//g' test.ext1
server32# cat test.ext1
regel 1
regel 2
regel 4
server32# ls -al
total 8
drwxr-xr-x 2 root admin 512 Oct 22 17:45 .
drwx--x--x 7 admin admin 512 Oct 22 17:43 ..
-rw-r--r-- 1 root admin 26 Oct 22 17:45 test.ext1
-rw-r--r-- 1 root admin 33 Oct 22 17:44 test.ext1.bak
Edit: Ow en je kunt ook wildcards gebruiken zoals:
server32# perl -pi.bak -e 's/regel 3//g' *
server32# perl -pi.bak -e 's/regel 3//g' */*/*/test.ext1
Zo un je complete subdirs ook aanpassen.
GuusDeGraeve
22/10/08, 13:02
Zoals ik dus zei....
server32# cat test.ext1
regel 1
regel 2
regel 3
regel 4
server32# perl -pi.bak -e 's/regel 3//g' test.ext1
server32# cat test.ext1
regel 1
regel 2
regel 4
server32# ls -al
total 8
drwxr-xr-x 2 root admin 512 Oct 22 17:45 .
drwx--x--x 7 admin admin 512 Oct 22 17:43 ..
-rw-r--r-- 1 root admin 26 Oct 22 17:45 test.ext1
-rw-r--r-- 1 root admin 33 Oct 22 17:44 test.ext1.bak
Edit: Ow en je kunt ook wildcards gebruiken zoals:
server32# perl -pi.bak -e 's/regel 3//g' *
server32# perl -pi.bak -e 's/regel 3//g' */*/*/test.ext1
Zo un je complete subdirs ook aanpassen.
Bedankt voor de info, ik snap het maar toch denk ik dat dit nog niet volledig doet wat ik vraag. Stel nu dat we deze situatie hebben:
# cat test1.txt
Test regel 1
Test regel 2
test regel 3
Test 4 regel
en we voeren dit commando uit:
# perl -pi.bak -e 's/regel 3//g' test.ext1
Het test1.txt bestand is aangepast maar niet de volledige regel is verwijderd (enkel de string/tekst die ik meegaf in het commando is er uit):
# cat test1.txt.bak
Test regel 1
Test regel 2
test
Test 4 regel
Dit is dus het probleem, de regel moet verwijderd worden als een bepaalde tekst in die regel voorkomt. De tekst is daarom niet altijd gelijk aan de volledige regel. Hierboven wil ik bijvoorbeeld een regel verwijderen als de tekst "regel 3" er in zit. Jammer genoeg lukt dit niet met het commando dat je mij gaf.
systemdeveloper
22/10/08, 13:19
Bedankt voor de info, ik snap het maar toch denk ik dat dit nog niet volledig doet wat ik vraag. Stel nu dat we deze situatie hebben:
# cat test1.txt
Test regel 1
Test regel 2
test regel 3
Test 4 regel
en we voeren dit commando uit:
# perl -pi.bak -e 's/regel 3//g' test.ext1
Het test1.txt bestand is aangepast maar niet de volledige regel is verwijderd (enkel de string/tekst die ik meegaf in het commando is er uit):
# cat test1.txt.bak
Test regel 1
Test regel 2
test
Test 4 regel
Dit is dus het probleem, de regel moet verwijderd worden als een bepaalde tekst in die regel voorkomt. De tekst is daarom niet altijd gelijk aan de volledige regel. Hierboven wil ik bijvoorbeeld een regel verwijderen als de tekst "regel 3" er in zit. Jammer genoeg lukt dit niet met het commando dat je mij gaf.
Dan doe je dat een beetje anders:
perl -pi.bak -e 's/(.*foobar.*)/#$1/g' *.txt
Zal alle regels met 'foobar' prefixen met een '#' teken (Perl commentaar)
perl -pi.bak -e 's/(.*foobar.*)/\/*$1*\//g' *.txt
Maakt er commentaar van met /* */ (php etc)
perl -pi.bak -e 's/(.*foobar.*)//g' *.txt
Verwijderd de hele regel.
Je kunt er alle kanten mee op, dus ook de jouwe ;)
Succes!