LINUX.ORG.RU

Ruby - строковые замены


0

1

Накопилось у меня скриптов для sed, и решил я переписать их на чем-нибудь еще. Тем более на работе коллеги стали пытаться это дело использовать, но у них Виндуза, и не все работает. Так что, все равно править.

Я не программист, только регулярные выражения освоил. Но сегодня поглядел на Ruby - вроде не сильно страшно.

Вобщем, родил/скопипастил такую конструкцию, как аналог 's/before/after/g':

ARGF.each do |line|
	line.gsub!( /before/, 'after' )
	puts line
end

Сразу возникает вопрос - насколько это грамотно, и можно ли лучше?

Далее, есть такой пример:

echo '( ( ( ( () ))) )' | sed 's/( *)//g'

Что бы убрать все скобки таким паттерном , нужно повторить sed несколько раз.

Но можно использовать t:

echo '( ( ( ( () ))) )' | sed ':a;s/( *)//g;ta'

и все убирается за один раз.

Как такую же фичу продублировать на Ruby?


Как такую же фичу продублировать на Ruby?

Точно так же.

$ echo 'blabla( ( ( ( () ))) )foofoo' | ruby -e 's=STDIN.read; 0 while s.gsub!(/\( *\)/,""); puts s'
blablafoofoo
geekless ★★
()
Ответ на: комментарий от geekless

А это на все, что после влияет, или только на следующую строку? То есть:

0 while
s.gsub!(изменения1)
s.gsub!(изменения2)
s.gsub!(изменения3)

повторятся будет только первое изменение, или все три?

gerth
() автор топика
Ответ на: комментарий от gerth

> А это на все, что после влияет, или только на следующую строку?

Яничонипонял.

0 while s.gsub!(/\( *\)/,"") — это while-цикл.

s.gsub!(/\( *\)/,"") — условие цикла. 0 — тело цикла, т.к. оно нам не нужно.

gsub! применяет замену к строке и возвращает значение строки, если замена произведена и nil — если замены не было. Соответственно, цикл будет крутиться пока в строке есть что заменять.

geekless ★★
()
Ответ на: комментарий от geekless

Блин, это я сразу не понял. Подумал, какая-то хитрая проверка - осталось, что заменять или нет.

gerth
() автор топика

Взял жирный текст и померил время на трех подстановках.

sed: 8.453s, 9.440s, 9.728s

ruby: 3.457s, 4.398s, 7.425s

Надо же, я думал sed, наоборот, быстрее будет.

gerth
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.