Regex 如何使用tcl删除文件的特定内容

Regex 如何使用tcl删除文件的特定内容,regex,tcl,Regex,Tcl,我对tcl非常陌生,在开始我的项目之前,我正在通过基本的例子来获得一些很好的理解 如果有人能帮助或建议删除文件特定内容的最佳方法,我将不胜感激 在我的例子中,LogData.dat文件中有一些数据,我希望打开此文件删除第3行,同时删除第一列(#Name、#Index、#mspace),然后在进行更改后保存文件 列数可能超过5列,但始终是第一列的#Name、#Index、#mspace需要删除,第3行需要删除 我想知道是否最好先删除第3行(去掉#mspace),然后将单词#Name、#Index与

我对tcl非常陌生,在开始我的项目之前,我正在通过基本的例子来获得一些很好的理解

如果有人能帮助或建议删除文件特定内容的最佳方法,我将不胜感激

在我的例子中,LogData.dat文件中有一些数据,我希望打开此文件删除第3行,同时删除第一列(#Name、#Index、#mspace),然后在进行更改后保存文件

列数可能超过5列,但始终是第一列的#Name、#Index、#mspace需要删除,第3行需要删除

我想知道是否最好先删除第3行(去掉#mspace),然后将单词#Name、#Index与regexp匹配,然后以某种方式删除#Name&#Index

我还需要记住,这些文件可能非常大(100mb),并且会有多个文件,所以我需要循环这些文件,直到所有文件都被修改。因此,如果我必须快速读写这么大的文件,就需要避免任何内存问题

如果有人能提供一些帮助或提供一个简单明了的例子,我们将不胜感激

示例(精简版)如下所示

#Name   Length  Width   height  Time
#Index  m   -   -   s
#mSpace 0   0   0   0
               13.4112                   0                   0                   0
             13.411177                   0      1.8827043e-007               0.001
             13.411122                   0      1.8827043e-007               0.002

我建议您阅读该文件并将其写入另一个文件,以便更容易遵循您自己的代码。你可以这样做:

# Open file for reading
set input [open "LogData.dat" r]
# Open file for writing
set output [open "newLogData.dat" w]

# This variable will help us know the line number
set ln 0

# Loop through each line of the file
while {[gets $input line] != -1} {
    incr ln
    if {$ln < 4} {
        if {$ln < 3} {
            # On lines 1 to 2, split the line on tab, remove the first
            # element of the result list and join it back with tabs
            set line [join [lreplace [split $line \t] 0 0] \t]
        } else {
            # Skip line 3 completely
            continue
        }
    }
    puts $output $line
}

close $input
close $output
#打开文件进行读取
设置输入[打开“LogData.dat”r]
#打开文件进行写入
设置输出[打开“newLogData.dat”w]
#这个变量将帮助我们知道行号
设置ln0
#循环浏览文件的每一行
而{[gets$input line]!=-1}{
增量ln
如果{$ln<4}{
如果{$ln<3}{
#在第1行到第2行,拆分选项卡上的行,删除第一个
#元素,并使用选项卡将其连接回来
设置行[join[lreplace[split$line\t]0]\t]
}否则{
#完全跳过第3行
持续
}
}
将$output$放入行
}
关闭$input
关闭$output

这里不需要regex,上面是一个示例,其中的文件内容已经包含在一个变量中


您可以放置类似于
文件delete LogData.dat
文件rename newLogData.dat LogData.dat
的内容来删除初始文件,并使用旧文件名重命名新文件。

我将刷Jerry的建议,从一个文件读取,然后写入另一个文件:

set input [open LogData.dat r]
set output [open newLogData.dat w]
字段似乎没有字符分隔,因此
split
无法按预期工作。如果每一行都是一个正确的列表,字段中没有空格,这不会导致任何问题

如果第三行在第一个字段中始终包含字符串
#mSpace
,而在第一个字段中没有其他行包含该字符串,则不需要计算行数。(更新:修复了
if
条件下的愚蠢打字错误,抱歉。)

在输出时,此代码将字段之间的连续空白字符压缩为单个空格字符

chan close $input
chan close $output
这段代码从每行中删除第一个字段,因为这似乎是您所要求的。重读你的问题,现在你似乎只想在前三行中把它去掉更新代码:

# Loop through each line of the file
while {[chan gets $input line] != -1} {
    set data [lassign $line first]
    if {[string match #* $first]} {
        if {$first ne "#mSpace"} {
            chan puts $output $data
        }
    } else {
        chan puts $output $line
    }
}
文件:


(注意:评论中提到的“Hoodiecrow”是我,我之前用过nick。)

tl;dr--请同时显示输入和所需输出。Jerry,感谢您的回复,让它看起来更省力。这正是我想要做的,更多的是让我知道下一步该做什么…谢谢这非常有帮助。嗨Hoodiecrow,谢谢你的回复。你和杰瑞都向我展示了如何以不同的方式编辑文件。非常感谢你。
# Loop through each line of the file
while {[chan gets $input line] != -1} {
    set data [lassign $line first]
    if {[string match #* $first]} {
        if {$first ne "#mSpace"} {
            chan puts $output $data
        }
    } else {
        chan puts $output $line
    }
}