4 votes

comment faire une regex de plage en ruby comme awk /start/,/stop/ ?

Je veux faire une regex de plage à la AWK comme ceci :

awk ' /hoststatus/,/\}/' file

En AWK, cela imprimerait toutes les lignes entre les deux motifs dans un fichier :

hoststatus {
host_name=myhost
modified_attributes=0
check_command=check-host-alive
check_period=24x7
notification_period=workhours
check_interval=5.000000
retry_interval=1.000000
event_handler=
}

Comment puis-je faire ça en Ruby ?

Bonus : Comment le feriez-vous en Python ?

C'est très puissant dans AWK, mais je suis nouveau dans Ruby, et je ne suis pas sûr de la façon dont vous le feriez. En Python, je n'ai pas non plus réussi à trouver une solution.

2voto

steenslag Points 29662

Ruby :

str =
"drdxrdx
hoststatus {
host_name=myhost
modified_attributes=0
check_command=check-host-alive
check_period=24x7
notification_period=workhours
check_interval=5.000000
retry_interval=1.000000
event_handler=
}"
str.each_line do |line|
  print line if line =~ /hoststatus/..line =~ /\}/
end

C'est l'infâme flip-flop .

1voto

1_CR Points 11848

Avec python qui passe les drapeaux multiline et dotall à re. Le ? qui suit le * le rend non gourmand.

>>> import re
>>> with open('test.x') as f:
...     print re.findall('^hoststatus.*?\n\}$', f.read(), re.DOTALL + re.MULTILINE)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X