From: "David A. Black" Date: 2009-01-05T06:28:18+09:00 Subject: Re: Ruby Command Line One Liner Hi -- On Fri, 2 Jan 2009, Alain Helfenstein wrote: > David A. Black wrote: >> Hi -- >> >> On Fri, 2 Jan 2009, Alain Helfenstein wrote: >> >>> ruby -i.bak -p -e 'puts ARGF.read.gsub(/.*(?=package)/m,"/**\n * foo.bar >>> 2001-2009\n\ **/\n")' test/Test.java >>> >>> Does anybody have a idea on how to solve this problem for all *.java >>> files in the test directory? >> >> The -p flag will do the read/write loop for you, so all you have to do >> is something like this: >> >> $ cat abc.txt >> hello >> $ cat def.txt >> goodbye >> >> $ ruby -pi.bak -e '$_.upcase!' abc.txt def.txt >> >> $ cat abc.txt >> HELLO >> $ cat def.txt >> GOODBYE >> >> >> David >> >> -- >> David A. Black / Ruby Power and Light, LLC >> Ruby/Rails consulting & training: http://www.rubypal.com >> Coming in 2009: The Well-Grounded Rubyist (http://manning.com/black2) >> >> http://www.wishsight.com => Independent, social wishlist management! > > Thanks a lot for your answer. > > The problem of the -p flag is, that the input stream is read line by > line. Then the regex /.*(?=package)/ will only be applied to one line. > But I want to remove all lines before the line starting with "package". > See the following example: > > /** > * header > **/ > package test; > ... > > The result of the replacement looks like this: > > /** > * foo.bar > **/ > package test; > ... > > If I use the one-liner at the top of the message with an input like > 'test/Tes*.java' then the ARGF stream does somehow not differ between > the different files. It sounds like you might want -n rather than -p. -n does the same loop, but without printing. You could arrange to print once you've hit /package/. David -- David A. Black / Ruby Power and Light, LLC Ruby/Rails consulting & training: http://www.rubypal.com Coming in 2009: The Well-Grounded Rubyist (http://manning.com/black2) http://www.wishsight.com => Independent, social wishlist management!