我有一个文件如下
$ ###########################################################
$ # text : text
$ # text : text
$ # text : text
$ # text : text
$ # text : text
$ ###########################################################
.some text
$$.some text
$ ###########################################################
$ # text : text
$ # text : text
$ #text : text
$ # text : text
$ # text : text
$ ###########################################################
$# some text
要提取的行是
Mg1.qna some text
Mg1.qpa text
这两行将被写入另一个文件.........
我有一些逻辑,但那是自然的标志.......尝试2给出想法,如果有的话
答案 0 :(得分:3)
检测是否要忽略某一行的最简单方法是使用string match
,尤其是涉及文字字符$
时(string match
并不特别)。例如:
set f [open $filename]
while {[gets $f line] >= 0} {
if {[string match "$$*" $line] || [string match "$ #*" $line]} {
# ignore by just going straight to the next loop iteration
continue
}
# Do the rest of your processing here...
}
close $f
请注意,虽然$
是字符串中的元字符,但如果后面没有字母,数字,冒号或括号,则它会替换为自身。如上所述,周期,星号和空格都很好。 (否则,您需要在每个美元符号前加上反斜杠\
。)
答案 1 :(得分:0)
这是我的解决方案,它使用Tclx包中的for_file来读取文件。您不必使用它,但我只是想显示一种替代方法来逐行读取文件。每个匹配的行都将写入输出文件:
package require Tclx
set inputFilename [lindex $argv 0]
set outputFilename [lindex $argv 1]
set outputChannel [open $outputFilename w]
for_file line $inputFilename {
# Only select those lines that does not start with '$' or '.'
if [regexp {^[^\$\.]} $line] {
puts $outputChannel $line
}
}
close $outputChannel
答案 2 :(得分:0)
在评论中将drysdam提到的解决方案扩展到问题
在shell上,您可以使用以下
grep ^ Mg file1> file2
也可以从TCL脚本执行相同的命令。
eval exec“grep ^ Mg file1> file2”
行动中:
==> tclsh的 %cat d1 MG1 镁 BG %
%eval exec“grep ^ Mg d1> d2”<<<<<<<<<< TCL的解决方案
%cat d2 MG1 MG2