如何动态连接两个文件并将结果引用为新文件?

如何动态连接两个文件并将结果引用为新文件?

我想连接两个文件,即staticEntries.dic和dynamicEntries.dic。正如名称所示,staticEntries.dic 的内容随着时间的推移保持不变(包含常用单词),但相反,dynamicEntries.dic 可能会随着时间的推移而改变(包含从数据库中提取的缩写)。在我的编辑器中,我想提供一个 mydict.dic,其中包含这两个文件的内容。当然,我可以通过 Shell 来完成此操作,但随后我必须替换 mydict.dic 文件中的dynamicEntries.dic 内容,然后才能将新版本的dynamicEntries.dic 连接到生成的mydict.dic。 -> 我想创建一个 mydict.dic 文件,其中包含连接其他两个文件的命令,但我不知道该怎么做。由于它不是由我的编辑器执行或调用的(我猜),所以我无法使用 bash 命令。

接下来是一个简单的例子:

staticEntries.dic 的内容

house
dog
horse

dynamicEntries.dic 的内容。该内容是基于数据库生成的,因此它会随着时间的推移而变化。

EGB38
PD
UH7ZT

mydict.dic 的追踪内容

house
dog
horse
EGB38
PD
UH7ZT

如果我通过 shell 进行该组合,如果生成了文件dynamicEntries.dic的新版本,我就会遇到问题:如何避免 mydict.dic 文件中的重复条目?因此,我想将串联命令放入一个文件中,并将其作为普通文件引用,我可以将其作为字典文件提供给编辑器。我不知道这是否可行,或者我是否必须采用另一种方法。

答案1

您可以编写一个位于命名管道后面的脚本,并在打开和读取时转储 staticEntries.dic 和dynamicEntries.dic 的内容。记下管道正在关闭并终止输出,直到它再次打开。

但是您必须让该脚本在后台运行,并记住在注销/登录或重新启动后再次启动它。

更重要的是,这不是 shell 编程新手的任务。

有时(通常),最简单的解决方案是最好的。

更简单的方法是创建一个 Makefile,将 mydict.dic 定义为依赖于其他两个文件,并记住在需要时运行 make 来更新它。或者只是一个 shell 脚本 - Makefile 的优点是您还可以从 cron 运行它,并且只有在任一源文件发生更改时它才会更新目标文件 (mydict.dic)。

例如:

#!/usr/bin/make -f

all: mydict.dic

mydict.dic: staticEntries.dic dynamicEntries.dic
        cat staticEntries.dic dynamicEntries.dic > mydict.dic.tmp
        mv mydict.dic.tmp mydict.dic

这些行以制表catmv开头,而不是空格。

串联文件首先创建为临时文件,然后移动到位,因此用新文件替换旧文件是一个原子操作。这样做的目的是,每当您使用该文件时,您要么拥有完整的旧版本,要么拥有完整的新版本,但永远不会拥有新版本的部分版本。

如果任一源 .dic 文件位于不同的目录中,则需要指定文件的完整路径名。

答案2

如果动态字典已被修改,我将运行一个小 cronjob 来重新连接文件。首先,编写一个小脚本来监视文件的更改:

#!/usr/bin/env bash
while true; do
  inotifywait -e modify path/to/dynamicEntries.dic
  sort path/to/dynamicEntries.dic /path/to/staticEntries.dic | 
    uniq > mydict.dic.tmp
  sleep 1
done

现在,将该脚本另存为dict.sh或其他内容,使其可执行(chmod a+x dict.sh)并创建一个在重新启动时启动该脚本的 crontab。运行crontab -e并粘贴到这一行:

@reboot /path/to/dict.sh

现在,每次动态字典发生变化时,字典都会自动更新,而您无需手动运行任何内容。

答案3

在 shell 中连接文件很简单:

cat staticEntries.dic dynamicEntries.dic

这将在 上打印这两个文件的内容stdout。如果要将结果重定向到新文件中,请执行以下操作:

cat staticEntries.dic dynamicEntries.dic > mydict.dic

但这可能不是您要找的......?我不得不说,我不太明白你想要解决的问题。

答案4

您可以更改称呼编辑的方式。假设您正在使用vi,您可以创建一个 shell 脚本editmydictionary.sh

cat staticEntries.dic dynamicEntries.dic > mydict.dic.tmp
vi mydict.dic.tmp

因此,每当您执行 时editmydictionary.sh,您都在编辑这两个文件的最新版本。

相关内容