LINUX.ORG.RU

ruby, regexp

 ,


1

1

Хочу отсеить в файле строки на ; и #, сами строки вида «число пробел число»:

myfile.each{ |line|
  line =~ (/(.*?)\s+(.*)/)
  next if line.match(/^[\;\#]/)
  print «a= #{$1} b= #{$2} \n»
}

Почему всегда выполняется этот next?! Даже с другой подстановкой типа (/^aaa/).

★★★★★

Ух ты, уже и в коде идиотские кавычки.

derlafff, спасибо, друг! ТС, «отсеять» == удалить? «На ; и #» - начинаются с этих символов?

cdshines ★★★★★
()
Последнее исправление: cdshines (всего исправлений: 1)
Ответ на: комментарий от yu-boot
[cdshines@v3700:~/devel/ruby/serv]
% cat text   
1 2
#haha
3 4
#dada
5 6
;nono
7 8
[cdshines@v3700:~/devel/ruby/serv]
% cat reg.rb 
File.open("text", "r").each_line do |l|
                puts l if l !~ /^[#;]/
end
[cdshines@v3700:~/devel/ruby/serv]
% ruby reg.rb
1 2
3 4
5 6
7 8

на запись по-другому открывать, но ты справишься)

cdshines ★★★★★
()
Последнее исправление: cdshines (всего исправлений: 3)
Ответ на: комментарий от special-k

Оказалось, match() всегда поганит переменные типа $1 $2, даже если в регэкспе не было группировок. Идиотизм.

yu-boot ★★★★★
() автор топика
Ответ на: комментарий от cdshines

IMHO, однострочник тут больше к месту:

╓─[nameless@localhost]┅┅(/tmp)
╙─[%> ruby -pe 'next if $_ =~ /^[;#]/' file.txt 
1 2
3 4
5 6
7 8

Если нужна in-place замена, то вместо ключа -e использовать -i.

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

красиво. правда, я всегда забываю, что руби можно использовать вот так.

cdshines ★★★★★
()
Ответ на: комментарий от yu-boot

Все правильно, $~ (поэтому и $n) после неуспешного матчинга сбрасываются в nil.

cdshines ★★★★★
()
Ответ на: комментарий от special-k

вот же:

line =~ (/(.*?)\s+(.*)/)
#...
print "a= #{$1} b= #{$2} \n"
я бы сделал как-то так тогда уже
File.open("text", "r").each_line do |l|
	if l !~ /^[#;]/
		l.match /(\d*)\s(\d*)/
		puts "a = #{$1} b = #{$2}"
	end
end

cdshines ★★★★★
()
Последнее исправление: cdshines (всего исправлений: 2)
Ответ на: комментарий от cdshines

Можно использовать вариант с negative lookahead assertion:

╓─[nameless@localhost]┅┅(/tmp)
╙─[%> cat script.rb 
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

while gets
  puts "a = #{$1} b = #{$2}" if $_ =~ /^(?![;#])(.*?)\s+(.*)/
end
╓─[nameless@localhost]┅┅(/tmp)
╙─[%> ruby script.rb file.txt 
a = 1 b = 2
a = 3 b = 4
a = 5 b = 6
a = 7 b = 8
╓─[nameless@localhost]┅┅(/tmp)
╙─[%> ruby -ne 'puts "a = #{$1} b = #{$2}" if $_ =~ /^(?![;#])(.*?)\s+(.*)/' file.txt 
a = 1 b = 2
a = 3 b = 4
a = 5 b = 6
a = 7 b = 8
theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от cdshines

вот же:

myfile.each{ |line|
  next if line.match(/^[\;\#]/)
  line =~ (/(.*?)\s+(.*)/)
  print "a= #{$1} b= #{$2} \n"
}

Вот что имел ввиду я.

l[0], l[2]

у тебя все цифры однозначные?

special-k ★★★★
()

а еще можно так :)

myfile.each{ |line|
  t = line.strip.split
  next if t.first[0] == ';' || t.first[0] == '#'
  print "a= #{t.first} b= #{t.last} \n"
}

special-k ★★★★
()
Ответ на: комментарий от theNamelessOne

надо будет заюзать однострочники на руби, но не удалить систему)

special-k ★★★★
()
Последнее исправление: special-k (всего исправлений: 1)
Ответ на: комментарий от special-k

мм а зачем тебе делать запрос и его обработку с разных сторон next..?

Ну да, неоптимальненько :) Можно было сначала next а потом парсить.

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