我正在尝试匹配期望编程中的字符串,如下所述
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 )相匹配。
答案 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
仅在单词的末尾匹配。它匹配在其左侧有单词字符的任何位置,以及右侧的非单词字符。如果字符串中的最后一个字符是单词字符,它也会匹配字符串的末尾。