1

我有以下代码:

set a "10.20.30.40"
regsub -all {.([0-9]+).([0-9]+).} $a {\2 \1} b

我正在尝试 grep IP 地址的第 2 和第 3 个八位字节。

预期输出:

20 30

实际输出:

20 04 0

我的错误是什么?

4

2 回答 2

2

我会完全远离正则表达式:

set b [join [lrange [split $a .] 1 2]]

将值拆分为点,取第二个和第三个元素,并用空格连接它们。

于 2015-05-19T13:10:57.400 回答
1

您需要为匹配组和捕获组设置变量,然后才能访问它们。这是一个例子:

set a "10.20.30.40"
set rest [regexp {[0-9]+\.([0-9]+)\.([0-9]+)\.[0-9]+} $a match submatch1 submatch2]
puts $submatch1
puts $submatch2

演示的输出

20
30

编辑

您可以通过这种方式使用 regsub 和 backerferences(我现在替换第 3 和第 2 个八位字节,只是为了演示)。请注意,必须对文字点进行转义:

set a "10.20.30.40"
regsub -all {\.([0-9]+)\.([0-9]+)\.} $a {.\2.\1.} b
puts $b

演示的输出:

10.30.20.40

要获得“20 30”字符串,您需要使用

regsub -all {^[0-9]+\.([0-9]+)\.([0-9]+)\.[0-9]+$} $a {\1 \2} b
于 2015-05-19T08:54:20.620 回答