[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Ruby Command Line One Liner

Alain Helfenstein

1/1/2009 7:51:00 PM

Hi,

I try to write a Ruby one-liner that replaces the header information of
some *.java files.

My first try worked perfect for a single file. But I have no idea on how
to change my one-liner to work with multiple files.

Here is my one-liner for a single file:

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?

Thanks for your answer,
Alain.
--
Posted via http://www.ruby-....

6 Answers

David A. Black

1/1/2009 7:57:00 PM

0

Hi --

On Fri, 2 Jan 2009, Alain Helfenstein wrote:

> Hi,
>
> I try to write a Ruby one-liner that replaces the header information of
> some *.java files.
>
> My first try worked perfect for a single file. But I have no idea on how
> to change my one-liner to work with multiple files.
>
> Here is my one-liner for a single file:
>
> 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.r...
Coming in 2009: The Well-Grounded Rubyist (http://manning....)

http://www.wis... => Independent, social wishlist management!

Hassan Schroeder

1/1/2009 8:35:00 PM

0

On Thu, Jan 1, 2009 at 11:51 AM, Alain Helfenstein
<a-helfenstein@bluewin.ch> wrote:

> I try to write a Ruby one-liner that replaces the header information of
> some *.java files.
>
> My first try worked perfect for a single file. But I have no idea on how
> to change my one-liner to work with multiple files.

You might be interested in this: <http://rush.herok...

--
Hassan Schroeder ------------------------ hassan.schroeder@gmail.com

Alain Helfenstein

1/2/2009 10:03:00 AM

0

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.r...
> Coming in 2009: The Well-Grounded Rubyist (http://manning....)
>
> http://www.wis... => 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.

Best regards, Alain.

--
Posted via http://www.ruby-....

David A. Black

1/4/2009 9:28:00 PM

0

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.r...
>> Coming in 2009: The Well-Grounded Rubyist (http://manning....)
>>
>> http://www.wis... => 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.r...
Coming in 2009: The Well-Grounded Rubyist (http://manning....)

http://www.wis... => Independent, social wishlist management!

William James

1/5/2009 8:08:00 PM

0

On Jan 1, 1:51 pm, Alain Helfenstein <a-helfenst...@bluewin.ch> wrote:
> Hi,
>
> I try to write a Ruby one-liner that replaces the header information of
> some *.java files.
>
> My first try worked perfect for a single file. But I have no idea on how
> to change my one-liner to work with multiple files.
>
> Here is my one-liner for a single file:
>
> 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?
>
> Thanks for your answer,
> Alain.
> --
> Posted viahttp://www.ruby-....

ruby -i.bak -0777 -pe"sub /.*foo/m,'bar'" *.java

Alain Helfenstein

1/11/2009 7:25:00 PM

0

unknown wrote:
> On Jan 1, 1:51�pm, Alain Helfenstein <a-helfenst...@bluewin.ch> 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?
>>
>> Thanks for your answer,
>> Alain.
>> --
>> Posted viahttp://www.ruby-....
>
> ruby -i.bak -0777 -pe"sub /.*foo/m,'bar'" *.java

Thanks a lot for the help.

The -0777 flag was the key to success, Alain.
--
Posted via http://www.ruby-....