如何使用 tcl 查找文件中的特定行

问题描述 投票:0回答:1

我有两个内容相似的文件,想从每个文件中提取某些行并比较它们的值。 我感兴趣的台词就是一个例子:

第一个文件:

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 : "{(^/)}"`

需要将所有这三个结合起来并抓住这样的线。

linux shell tcl tclsh
1个回答
0
投票

而不是使用

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
}
© www.soinside.com 2019 - 2024. All rights reserved.