【问题标题】:How do I choose where to output in a file?如何选择文件中的输出位置?
【发布时间】:2022-01-25 09:46:12
【问题描述】:

我有一个这样的文件:

file1:
a aa 
b bb
c cc
file 2: 
d dd ddd
e ee eee

我想将file2的内容输出到file1,在我选择的模式所在的行,就像在a之前,在b之后这样:

file 1:
d dd ddd
a aa 
b bb
e ee eee
c cc

我只知道如何在tcl中使用puts或在csh中使用>>和echo,但它们只在最后一行输出。

【问题讨论】:

  • 为什么不创建第三个文件?读取 F1 和 F2,然后根据需要输入 F3。
  • 我想我也可以这样做,但这样做不是更难吗?我不能只添加d dd ddd,然后添加a aa b bb,然后添加e ee eee,然后:c cc,我认为找到模式并添加行会更快
  • 我认为应该更容易。例如。在您的情况下,您如何选择要在 F1 行之间插入 F2 行的位置?使用相同的逻辑,通读这两个文件并创建第三个文件。
  • 我正在尝试为我的脚本(文件 1 和许多其他文件)设置一个运行时,它将有许多命令和 proc。所以我试图找到一种方法在我选择的命令/过程之间以及在多个脚本中插入类似date >>runtime 的东西。为此,我需要知道如何在我选择的哪一行插入,这样我就可以在我的脚本中实现以供将来使用
  • 查看ed?例如,printf "%s\n" '/a/-1 r file2' w | ed -s file1 会将 file2 的 整个 内容插入到 file1 的第一行之前,其中包含一个 a 并保存更改的文件。

标签: linux tcl csh tcsh


【解决方案1】:

您可以使用seek 来更改文件中通道指向的位置,但这可以使用文件中的 byte 偏移量(与字符的对应关系很复杂,取决于编码和内容真的是)。它也不会改变您没有明确重写的任何数据的字节偏移量;虽然这对于二进制数据通常是绝对好的,但对于文本数据来说这是一个问题,因为它通常会在重写时改变行的长度。 (这是 POSIX 和 Windows 查看文件的固有方式;因此,许多语言的工作方式相同。)

所以……对于文本,实际上最好将所有文本加载到内存中,在那里执行编辑,然后从头开始编写整个文件,因为就地文本编辑是可能的,但非常尴尬,几乎没有人这样做。


以下两个过程是用于在文件和文本行列表之间进行转换的简单节。

proc linesOfFile {filename} {
    set f [open $filename]
    try {
        return [split [read -nonewline $f] "\n"]
    } finally {
        close $f
    }
}

proc writeLinesToFile {lines filename} {
    set f [open $filename w]
    try {
        puts $f [join $lines "\n"]
    } finally {
        close $f
    }
}

# Read the data
set linesOf1 [linesOfFile file1.txt]
set linesOf2 [linesOfFile file2.txt]

# Do the edits; indices are zero-based
set linesOf1 [linsert $linesOf1 0 [lindex $linesOf2 0]]
set linesOf1 [linsert $linesOf1 3 [lindex $linesOf2 1]]

# Write back
writeLinesToFile $linesOf1 file1.txt

我不知道如何合并文件,除了像那样插入行;有很多选择,但你保留了这些信息。

【讨论】:

  • 谢谢你的回答,我明白了。
猜你喜欢
  • 2014-12-09
  • 2015-06-21
  • 1970-01-01
  • 2018-12-26
  • 2019-08-03
  • 2016-07-11
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多