Help with an "easy" regular expression substitution

Hi, I'm getting crazy to get a theorically easy substitution:

I've a file with a header:
  X-Level: ***
where the number of "*" is variable (from 0 up to 10).

And I just want to replace "*" by "X", so get:
  X-Level: XXX

I don't get it since I don't know how to replace ANY number of "*" with the
same number of "X" just in the header "X-Level".

Any help? Thanks a lot.

···

--
Iñaki Baz Castillo

Hi --

···

On Mon, 15 Dec 2008, Iñaki Baz Castillo wrote:

Hi, I'm getting crazy to get a theorically easy substitution:

I've a file with a header:
X-Level: ***
where the number of "*" is variable (from 0 up to 10).

And I just want to replace "*" by "X", so get:
X-Level: XXX

I don't get it since I don't know how to replace ANY number of "*" with the
same number of "X" just in the header "X-Level".

Any help? Thanks a lot.

The first thing that comes to mind:

   text.sub(/(X-Level: )(\*+)/) { $1 + 'X' * $2.size }

or, in Oniguruma, using look-behind:

  text.sub(/(?<=X-Level: )(\*+)/) { 'X' * $1.size }

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\)

Iñaki Baz Castillo wrote:

Hi, I'm getting crazy to get a theorically easy substitution:

I've a file with a header:
  X-Level: ***
where the number of "*" is variable (from 0 up to 10).

And I just want to replace "*" by "X", so get:
  X-Level: XXX

I don't get it since I don't know how to replace ANY number of "*"
with the same number of "X" just in the header "X-Level".

Any help? Thanks a lot.

s = "X-Level: ***"
    ==>"X-Level: ***"
s[ /X-Level: (\**)/, 1 ] = $1.gsub("*", "X")
    ==>"XXX"
s
    ==>"X-Level: XXX"

Since I haven't seen the obvious answer yet...

text.tr('*','X')

-- Mark.

···

On Dec 14, 1:33 pm, Iñaki Baz Castillo <i...@aliax.net> wrote:

Hi, I'm getting crazy to get a theorically easy substitution:

I've a file with a header:
X-Level: ***
where the number of "*" is variable (from 0 up to 10).

And I just want to replace "*" by "X", so get:
X-Level: XXX

I don't get it since I don't know how to replace ANY number of "*" with the
same number of "X" just in the header "X-Level".

Thanks, this is valid in Ruby, but I understand such a operation is not
feasible with "sed" command, is it?
I'm not sure yet about if I'll need to do this script in Ruby or Shell.

Thanks a lot.

···

El Domingo, 14 de Diciembre de 2008, David A. Black escribió:

The first thing that comes to mind:

text.sub(/(X-Level: )(\*+)/) { $1 + 'X' * $2.size }

or, in Oniguruma, using look-behind:

text.sub(/(?<=X-Level: )(\*+)/) { 'X' * $1.size }

--
Iñaki Baz Castillo

Mark,
The request was to make the replacement only in the header, isn't it?
:slight_smile:

K

···

On Dec 15, 2:42 pm, Mark Thomas <m...@thomaszone.com> wrote:

On Dec 14, 1:33 pm, Iñaki Baz Castillo <i...@aliax.net> wrote:

> Hi, I'm getting crazy to get a theorically easy substitution:

> I've a file with a header:
> X-Level: ***
> where the number of "*" is variable (from 0 up to 10).

> And I just want to replace "*" by "X", so get:
> X-Level: XXX

> I don't get it since I don't know how to replace ANY number of "*" with the
> same number of "X" just in the header "X-Level".

Since I haven't seen the obvious answer yet...

text.tr('*','X')

-- Mark.

Iñaki Baz Castillo wrote:

···

El Domingo, 14 de Diciembre de 2008, David A. Black escribió:

The first thing that comes to mind:

text.sub(/(X-Level: )(\*+)/) { $1 + 'X' * $2.size }

or, in Oniguruma, using look-behind:

text.sub(/(?<=X-Level: )(\*+)/) { 'X' * $1.size }

Thanks, this is valid in Ruby, but I understand such a operation is
not feasible with "sed" command, is it?
I'm not sure yet about if I'll need to do this script in Ruby or
Shell.

Thanks a lot.

sed '/^X-Level: /s/\*/X/g'

~]$ echo "X-Level: ****" | sed '/^X-Level: /s/\*/X/g'
X-Level: XXXX
~]$ echo "X-Level: ***********" | sed '/^X-Level: /s/\*/X/g'
X-Level: XXXXXXXXXXX

--
Tim Greer, CEO/Founder/CTO, BurlyHost.com, Inc.
Shared Hosting, Reseller Hosting, Dedicated & Semi-Dedicated servers
and Custom Hosting. 24/7 support, 30 day guarantee, secure servers.
Industry's most experienced staff! -- Web Hosting With Muscle!

Hi --

···

On Mon, 15 Dec 2008, Iñaki Baz Castillo wrote:

El Domingo, 14 de Diciembre de 2008, David A. Black escribió:

The first thing that comes to mind:

text.sub(/(X-Level: )(\*+)/) { $1 + 'X' * $2.size }

or, in Oniguruma, using look-behind:

text.sub(/(?<=X-Level: )(\*+)/) { 'X' * $1.size }

Thanks, this is valid in Ruby, but I understand such a operation is not
feasible with "sed" command, is it?
I'm not sure yet about if I'll need to do this script in Ruby or Shell.

Just in case:

sed -Ee '/X-Level: \*+/s/\*/X/g'

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\)

not sure if I understand what you're trying to do.. but it sounds like ***
is a number right?
so
text.tr('*','X')
becomes
text.tr('\d','X')

HTH
/Shawn

···

On Mon, Dec 15, 2008 at 9:12 AM, XY$ <kwicher@gmail.com> wrote:

On Dec 15, 2:42 pm, Mark Thomas <m...@thomaszone.com> wrote:
> On Dec 14, 1:33 pm, Iñaki Baz Castillo <i...@aliax.net> wrote:
>
> > Hi, I'm getting crazy to get a theorically easy substitution:
>
> > I've a file with a header:
> > X-Level: ***
> > where the number of "*" is variable (from 0 up to 10).
>
> > And I just want to replace "*" by "X", so get:
> > X-Level: XXX
>
> > I don't get it since I don't know how to replace ANY number of "*" with
the
> > same number of "X" just in the header "X-Level".
>
> Since I haven't seen the obvious answer yet...
>
> text.tr('*','X')
>
> -- Mark.

Mark,
The request was to make the replacement only in the header, isn't it?
:slight_smile:

K

> Since I haven't seen the obvious answer yet...

> text.tr('*','X')

> -- Mark.

Mark,
The request was to make the replacement only in the header, isn't it?
:slight_smile:

excuse me...

header.tr('*','X')

Better? :slight_smile:

-- Mark.

Tim Greer wrote:

sed '/^X-Level: /s/\*/X/g'

Pardin, you probably won't need to backware that meta character.

sed '/^X-Level: /s/*/X/g'

···

--
Tim Greer, CEO/Founder/CTO, BurlyHost.com, Inc.
Shared Hosting, Reseller Hosting, Dedicated & Semi-Dedicated servers
and Custom Hosting. 24/7 support, 30 day guarantee, secure servers.
Industry's most experienced staff! -- Web Hosting With Muscle!

Great! I didn't know that usage of "sed"!

Thanks a lot.

···

El Domingo, 14 de Diciembre de 2008, David A. Black escribió:

Just in case:

sed -Ee '/X-Level: \*+/s/\*/X/g'

--
Iñaki Baz Castillo

Hi --

Since I haven't seen the obvious answer yet...

text.tr('*','X')

-- Mark.

Mark,
The request was to make the replacement only in the header, isn't it?
:slight_smile:

excuse me...

header.tr('*','X')

Better? :slight_smile:

If you can be sure you won't get any false positives. The original
question was how to change:

   X-Level: ***

to

   X-Level: XXX

I don't know whether * occurs on other lines.

David

···

On Tue, 16 Dec 2008, Mark Thomas wrote:

--
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\)

Mark Thomas wrote:

excuse me...

header.tr('*','X')

Better? :slight_smile:

No, because you just changed the problem. The specified input was the whole
string, not only the part of the string that should change. And the desired
output was that whole string with the part that should be changed, changed
and the rest as-is.
You could of course do
text.sub(/X-Level: \*+/) {|header| header.tr("*","X") }
but that's not neccessarily simpler than the already offered solutions.

HTH,
Sebastian

···

--
Jabber: sepp2k@jabber.org
ICQ: 205544826

As we are strolling OT alreeady :wink: It is turing complete, and someone
wrote a web server in sed.
But nobody knows what happened to him, a sed story....
R.

···

On Sun, Dec 14, 2008 at 10:15 PM, Iñaki Baz Castillo <ibc@aliax.net> wrote:

El Domingo, 14 de Diciembre de 2008, David A. Black escribió:

Just in case:

sed -Ee '/X-Level: \*+/s/\*/X/g'

Great! I didn't know that usage of "sed"!

You are correct, of course. And that's what I was trying to imply,
that it was only solving one piece of the problem. I guess I should
have explained it, rather than be glib with my response. If the header
was easily (or already) isolated, it would be a simple solution. But
that information was not given by the OP.

···

On Dec 16, 7:09 am, Sebastian Hungerecker <sep...@googlemail.com> wrote:

Mark Thomas wrote:
> excuse me...

> header.tr('*','X')

> Better? :slight_smile:

No, because you just changed the problem. The specified input was the whole
string, not only the part of the string that should change. And the desired
output was that whole string with the part that should be changed, changed
and the rest as-is.
You could of course do
text.sub(/X-Level: \*+/) {|header| header.tr("*","X") }
but that's not neccessarily simpler than the already offered solutions.