Help with an "easy" regular expression substitution

  • Thread starter Iñaki Baz Castillo
  • Start date
I

Iñaki Baz Castillo

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=
=20
same number of "X" just in the header "X-Level".

Any help? Thanks a lot.


=2D-=20
I=C3=B1aki Baz Castillo
 
I

Iñaki Baz Castillo

El Domingo, 14 de Diciembre de 2008, David A. Black escribi=C3=B3:
The first thing that comes to mind:

=C2=A0 =C2=A0text.sub(/(X-Level: )(\*+)/) { $1 + 'X' * $2.size }

or, in Oniguruma, using look-behind:

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

Thanks, this is valid in Ruby, but I understand such a operation is not=20
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.

=2D-=20
I=C3=B1aki Baz Castillo
 
T

Tim Greer

Iñaki Baz Castillo said:
El Domingo, 14 de Diciembre de 2008, David A. Black escribió:

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
 
I

Iñaki Baz Castillo

El Domingo, 14 de Diciembre de 2008, David A. Black escribi=C3=B3:
Just in case:

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

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

Thanks a lot.

=2D-=20
I=C3=B1aki Baz Castillo
 
W

William James

Iñaki Baz Castillo said:
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"
 
R

Robert Dober

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

Great! I didn't know that usage of "sed"!
As we are strolling OT alreeady ;) It is turing complete, and someone
wrote a web server in sed.
But nobody knows what happened to him, a sed story....
R.
 
M

Mark Thomas

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.
 
S

Shawn Anderson

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
 
D

David A. Black

Hi --

excuse me...

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

Better? :)

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
 
S

Sebastian Hungerecker

Mark said:
excuse me...

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

Better? :)

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
 
M

Mark Thomas

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.

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top