PDA

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!

Keizer
22/10/08, 10:27
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?

Jurian
22/10/08, 10:50
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? :)

xabin
22/10/08, 11:07
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.

groenleer
22/10/08, 11:11
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!