Vervangen van blok tekst op Linux met Perl (of sed / awk)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mastakilla
  • Registratie: Februari 2001
  • Laatst online: 29-08 11:51
Hallo,

Ik probeer al een tijdje een stuk tekst van meerdere lijnen te vervangen, maar dit wil niet echt lukken.

Bv:

code:
1
2
test1test2
test3


vervangen door:

code:
1
test4


Ik probeer dit met:
perl -pi -e's/test1test2\012test3/test4/g' testfile
of
perl -pi -e's/test1test2\012test3/test4/gm' testfile
of
perl -pi -e's/test1test2\ntest3/test4/gm' testfile
of
perl -pi -e's/test1test2.test3/test4/gms' testfile
etc

Maar dit werkt dus niet...

Blijkbaar werkt het niet vanaf je in je regex iets zet na de newline...

Dit werkt bv wel:
perl -pi -e's/test1test2\012/test4/g' testfile

Maar dan vervangt ie enkel 1 lijn terwijl ik juist meerdere lijnen wil vervangen...

Ik heb het ook al ff met sed geprobeerd, maar deze heeft exact hetzelfde probleem (waarschijnlijk omdat ie regular expressions op dezelfde manier verwerkt)

Heeft iemand een idee hoe ik dit kan doen?

[ Voor 9% gewijzigd door Mastakilla op 24-02-2010 16:48 ]


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
[google=perl OR awk OR sed replace text multi line] Zit daar echt niets tussen? :?

offtopic:
Waarom een engelse topictitel? Zeg ik als anglofiel :p

Acties:
  • 0 Henk 'm!

  • RM-rf
  • Registratie: September 2000
  • Laatst online: 17:49

RM-rf

1 2 3 4 5 7 6 8 9

ergens vermoed ik dat als \n of \012 niet matched, dat mischien eraan kan liggen dat de newlines ook \n\r kunnen zijn?


of bv het te proberen met perl -pi -e's/test1test2.*test3/test4/gms' testfile.
de /s modifier maakt dat de meer-reglige string behandeld wordt als één regel, en '.' ook newline tekens herkend

[ Voor 46% gewijzigd door RM-rf op 24-02-2010 17:00 ]

Intelligente mensen zoeken in tijden van crisis naar oplossingen, Idioten zoeken dan schuldigen


Acties:
  • 0 Henk 'm!

  • swbr
  • Registratie: Maart 2009
  • Laatst online: 16:47
vervang de eerste regel en verwijder de X regels die daarna komen?

If you try and take a cat apart to see how it works, the first thing you have on your hands is a non-working cat. -DNA


Acties:
  • 0 Henk 'm!

  • Mastakilla
  • Registratie: Februari 2001
  • Laatst online: 29-08 11:51
JanDM schreef op woensdag 24 februari 2010 @ 16:52:
[google=perl OR awk OR sed replace text multi line] Zit daar echt niets tussen? :?

offtopic:
Waarom een engelse topictitel? Zeg ik als anglofiel :p
heb al een namiddag zitten googlen hierop, zonder succes.
de "m" van /gm is voor "multiline, maar dat doet dus niet wat ik hoopte...

bv:
http://blazonry.com/perl/regexp_ref.php

en engelse topic titel omdat dat beter klinkt ;)
RM-rf schreef op woensdag 24 februari 2010 @ 16:53:
ergens vermoed ik dat als \n of \012 niet matched, dat mischien eraan kan liggen dat de newlines ook \n\r kunnen zijn?


of bv het te proberen met perl -pi -e's/test1test2.*test3/test4/gms' testfile.
de /s modifier maakt dat de meer-reglige string behandeld wordt als één regel, en '.' ook newline tekens herkend
bedankt voor de tip, maar die had ik dus ook al geprobeert... (zonder succes)

het zijn trouwens wel degelijk unix new line chars en \n komt bij mijn weten overeen met \012
Antaresje schreef op woensdag 24 februari 2010 @ 16:54:
vervang de eerste regel en verwijder de X regels die daarna komen?
het probleem is dat ik het enkel wil vervangen als de volledig blok tekst gevonden worden... Ik kan dus niet echt checken of ik de 1e lijn vind, want dan vervang ik misschien teveel...

[ Voor 52% gewijzigd door Mastakilla op 24-02-2010 17:15 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
$ perl -pi -0777 -e's/test1test2\ntest3/test4/g' testfile

Moest ik ook even opzoeken via deze pagina. :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Mastakilla
  • Registratie: Februari 2001
  • Laatst online: 29-08 11:51
pedorus schreef op woensdag 24 februari 2010 @ 17:22:
$ perl -pi -0777 -e's/test1test2\ntest3/test4/g' testfile

Moest ik ook even opzoeken via deze pagina. :)
enorm bedankt!!!

die doet het dus inderdaad :)

dit is mijn uiteindelijke replace commando
code:
1
perl -pi -0777 -e's/JAVA_LIBS=\$JAVA_HOME\/jre\/lib\/PA_RISC\/:\$JAVA_HOME\/jre\/lib\/PA_RISC\/classic\/:\$JAVA_HOME\/jre\/lib\/PA_RISC2\.0W\/server\012\012SHLIB_PATH=\${EPICS_LIBS}:\${JAVA_LIBS}\012\012export CLASSPATH \012export SHLIB_PATH /JAVA_LIBS=\$JAVA_HOME\/jre\/lib\/amd64\/:\$JAVA_HOME\/jre\/lib\/amd64\/server\012LD_LIBRARY_PATH=\${LD_LIBRARY_PATH}:\${EPICS_SYS}\/ohs\/lib:\${EPICS_BD}\/lib\012\012SHLIB_PATH=\${EPICS_LIBS}:\${JAVA_LIBS}\012\012export CLASSPATH\012export SHLIB_PATH\012export LD_LIBRARY_PATH/g' testi

iemand een idee wat de maximale lengte van een commando is op RHEL Linux?

hints ivm het iets leesbaarder maken zijn welkom ;) (ben nu aan het probreren het wat op te splitsen met env vars...)

[ Voor 5% gewijzigd door Mastakilla op 24-02-2010 17:59 ]


Acties:
  • 0 Henk 'm!

  • swbr
  • Registratie: Maart 2009
  • Laatst online: 16:47
Mastakilla schreef op woensdag 24 februari 2010 @ 17:45:
iemand een idee wat de maximale lengte van een commando is op RHEL Linux?
Kun je opvragen met het volgende commando (resultaat is in bytes)

code:
1
$ getconf ARG_MAX
hints ivm het iets leesbaarder maken zijn welkom ;) (ben nu aan het probreren het wat op te splitsen met env vars...)
Een enter op de command line kun je ook gewoon escapen.

code:
1
2
ls *\
.jpg


In een script kun je hetzelfde doen, op het moment dat je naar een 'nieuwe' regel wilt springen, zet je een \ neer om vervolgens op de volgende regel verder te gaan met je commando. Of dat in dit geval ook gaat lukken betwijfel ik eerlijk gezegd, tenzij je alleen buiten de quotes gaat escapen.

If you try and take a cat apart to see how it works, the first thing you have on your hands is a non-working cat. -DNA

Pagina: 1