使用expect匹配“仅整个文本”

时间:2014-11-12 08:44:15

标签: expect

我正在尝试匹配期望编程中的字符串,如下所述

send "cd $tftproot/cmbuild\r"
expect \\$
send "ls -lrt\r"

expect -ex "10.0.1.10000-2" {
      send "touch $builddir\r"
      expect \\$
  }

在指定的目录中,有另一个名为 10.0.1.10000-24 的文件。 expect命令 expect -ex“10.0.1.10000-2”与文件 10.0.1.10000-24 匹配,并且正在通过。

我甚至试过 expect -exact“10.0.1.10000-2”期望“10.0.1.10000-2”,这两个命令都已通过。

我希望与我传递的确切字符串( 10.0.1.10000-2 )相匹配。

1 个答案:

答案 0 :(得分:1)

可以有很多方法。假设您的文件将始终是该目录中最后列出的文件,如下所示,

/var/root # ls -lrt                                                             
total 4                                                                         
-rw-r--r--    1 root     root           242 Nov 12 10:08 hello.c                
lrwxrwxrwx    1 root     root             9 Nov 12 10:08 dos -> /root/dos                  
-rw-r--r--    1 root     root             0 Nov 12 10:08 10.0.1.10000-24
-rw-r--r--    1 root     root             0 Nov 12 10:08 10.0.10000-2        
/var/root # 

然后您可以将模式用作

expect  "10.0.1.10000-2$" {
      send "touch $builddir\r"
      expect \\$
  }

如果您的文件可以位于任何条目之间,则匹配换行符\n

expect "10.0.1.10000-2\n" {
      send "touch $builddir\r"
      expect \\$
  } 

或匹配空白字符\s

expect "10.0.1.10000-2\s+" {
          send "touch $builddir\r"
          expect \\$
      }

可以根据您的要求使用。

为避免这种混淆,您可以直接使用ls 10.0.1.10000-2,这样会更好,只有匹配该名称才能获得输出。

更新:

还有一种更简单的方法。我们可以使用字边界(\m\M)。

expect "10.0.1.10000-2\M" {
              send "touch $builddir\r"
              expect \\$
          }

\m仅在单词的开头匹配。也就是说,它匹配在其左侧具有非单词字符的任何位置,以及在其右侧具有单词字符。如果字符串中的第一个字符是单词字符,它也会在字符串的开头匹配。 \M仅在单词的末尾匹配。它匹配在其左侧有单词字符的任何位置,以及右侧的非单词字符。如果字符串中的最后一个字符是单词字符,它也会匹配字符串的末尾。