sed recursief?

Pagina: 1
Acties:

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Hoi


Ik ben bezig met het 'ombouwen' van wat source, op de details ga ik verder niet in, maar ik moet

<a> vervangen door <b>.

Dat lukt prima met sed:
code:
1
sed -i "s/<a>/<b>/g" *.cpp


Alleen is de code die ik heb gemakat door een user geschreven van en $scheldwoord compiler, een en die heeft dus zo'n 200 mappen aangemaakt (ja fijn he... diverse kleine stukkies software etc).

Hoe los ik dit op?

Er zijn 2 trucs, een recursieve sed... alleen staat er niets in de manpage over.
Of find, en dan een voor een de complete file-names voeren aan sed... alleen weet ik niet hoe dat moet (nee ook niet na lezen).

Heeft iemand hier ervaring mee?

(probleem stelling is dus: in een hele boomstructuur bestandjes aan sed voeren.... hoe?)

Zaram module kopen voor je glasvezelaansluiting?


  • Ivo
  • Registratie: Juni 2001
  • Laatst online: 14-01-2025

Ivo

code:
1
2
3
4
5
6
7
8
9
10
11
12
function process(dir)
  cd $dir
  for file in `ls`
  do if [ $file is directory ] then
    process($file)
  else if [file ends with *.cpp] then
    sed -i "s/<a>/<b>/g" $file
  fi
  cd ..
  done

process(.)

Nu is mijn bash-kennis wat matig dus de expressies in de if-statements kan ik je niet direct geven, maar de structuur lijkt me duidelijk.

[ Voor 14% gewijzigd door Ivo op 24-06-2006 19:10 ]


Verwijderd

code:
1
find . -name *.cpp -print0 | xargs -0 sed -i "s/<a>/<b>/g"


@hieronder: is find -exec niet trager dan de xargs oplossing?

[ Voor 70% gewijzigd door Verwijderd op 24-06-2006 19:25 . Reden: rekening gehouden met spaties in bestandsnamen ]


  • jkf
  • Registratie: Oktober 2000
  • Laatst online: 21-06-2025

jkf

find . -name "*.cpp" -exec sed -i 's/<a>/<b>/g' {} \;

simplified

[ Voor 81% gewijzigd door jkf op 24-06-2006 19:23 ]

P II 233 @ begane grond, rip (1997-2007), vervangen door vituele server uptime,


  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
Verwijderd schreef op zaterdag 24 juni 2006 @ 19:16:
code:
1
find . -name *.cpp | xargs sed -i "s/<a>/<b>/g"
nog mooier is:
find . -name *.cpp -exec sed -i s/<a>/<b>/g {} \;

( hierbij loop je niet het risico dat de argument list te groot is om dmv het pipe symbool
door te geven aan het sed commando )

edit: wat JFk zegt dus, * u_nix_we_all is een beetje traag

[ Voor 13% gewijzigd door u_nix_we_all op 24-06-2006 19:24 ]

You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.


  • Z-Dragon
  • Registratie: December 2002
  • Laatst online: 14:42
Alleen werkt find niet met '*'. Dan moet je er volgensmij '\*.cpp\' (mét aanhalingstekens!) van maken. Desnoods maak je er 'for i in `ls | grep ".cpp"`; do ...; done' van.

[ Voor 60% gewijzigd door Z-Dragon op 24-06-2006 19:42 ]

^ Wat hij zegt.


Verwijderd

Z-Dragon schreef op zaterdag 24 juni 2006 @ 19:40:
Alleen werkt find niet met '*'. Dan moet je er volgensmij '\*.cpp\' (mét aanhalingstekens!) van maken. Desnoods maak je er 'for i in `ls | grep ".cpp"`; do ...; done' van.
Met alleen quotes escape je het * teken al dus dat is niet nodig. en met de tweede oplossing lees je alleen maar een directory lijst in, niet de hele boom structuur.
Pagina: 1