1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
module Puppet::Parser::Functions
newfunction(:regsubst, :type => :rvalue,
:doc => "
Perform regexp replacement on a string.
- **Parameters** (in order):
:str: The string to operate on.
:regexp: The regular expression matching the string. If you want it anchored at the start and or end of the string, you must do that with ^ and $ yourself.
:replacement: Replacement string. Can contain back references to what was matched using 0, 1, and so on.
:flags: Optional. String of single letter flags for how the regexp is interpreted:
- **E** Extended regexps
- **I** Ignore case in regexps
- **M** Multiline regexps
- **G** Global replacement; all occurrences of the regexp in the string will be replaced. Without this, only the first occurrence will be replaced.
:lang: Optional. How to handle multibyte characters. A single-character string with the following values:
- **N** None
- **E** EUC
- **S** SJIS
- **U** UTF-8
- **Examples**
Get the third octet from the node's IP address::
$i3 = regsubst($ipaddress,'^([0-9]+)[.]([0-9]+)[.]([0-9]+)[.]([0-9]+)$','\\3')
Put angle brackets around each octet in the node's IP address::
$x = regsubst($ipaddress, '([0-9]+)', '<\\1>', 'G')
") \
do |args|
flag_mapping = {
"E" => Regexp::EXTENDED,
"I" => Regexp::IGNORECASE,
"M" => Regexp::MULTILINE,
}
if args.length < 3 or args.length > 5
raise Puppet::ParseError, ("regsub(): wrong number of arguments" +
" (#{args.length}; min 3, max 5)")
end
str, regexp, replacement, flags, lang = args
reflags = 0
global = false
(flags or "").each_byte do |f|
f = f.chr
if f == "G"
global = true
else
fvalue = flag_mapping[f]
if !fvalue
raise Puppet::ParseError, "regsub(): bad flag `#{f}'"
end
reflags |= fvalue
end
end
re = Regexp.compile(regexp, reflags, lang)
if global
result = str.gsub(re, replacement)
else
result = str.sub(re, replacement)
end
return result
end
end
|