我有两个内容相似的文件,想从每个文件中提取某些行并比较它们的值。 我感兴趣的台词就是一个例子:
第一个文件:
11 stringABC /dir/path/to/stringABC
20 stringXYZ /dir/path/stringXYZ
第二个文件:
13 stringABC /dir/path/of/secondFile/stringABC
151 stringXYZ /dir/path/stringXYZ
25 stringabc /dir/path/to/stringabc
一旦我能在两个文件中识别出这样的行,我就会比较 stringABC 和 stringXYZ 的路径。输出将显示 stringABC 的路径差异,而它与 stringXYZ 匹配,并且在第一个文件中缺少 stringabc 的条目。
我正在使用正则表达式查找以一些数字开头,后跟一些字符串然后是目录路径的模式。
First : "{^(\d)*}"
Second: "[a-z]"
Third : "{(^/)}"`
需要将所有这三个结合起来并抓住这样的线。
而不是使用
regexp
,尝试scan
命令:
set line "25 stringabc /dir/path/to/stringabc"
if {[llength $line]==3 && [scan $line "%d %s %s" num str path] == 3} {
if {[string match /* $path]} {
# Do something with $num, $str, $path
}
} else {
# The line didn't start with an integer followed by two strings
}
使用
scan
通常比 regexp
更容易使用,但在可能的行可能包含意外内容的情况下不够健壮。
以下正则表达式将精确匹配一个整数,后跟一个字母数字字符串,最后以路径名结尾。
if {[regexp {^(\d+) +(\w+) +([[:alnum:]/]+$)} $l -> num str path] == 1} {
# This matches. Do something with $num, $str and $path
}