使用 bash 将带有一个变量的多行文本添加到多个文件

使用 bash 将带有一个变量的多行文本添加到多个文件

我想创建一个脚本,将多行文本作为标题放在多个带txt扩展名的文件中。但要插入的文本还包括要插入的文件的名称。

以下是要插入的文本:

abcdgd FILENAME dhsgabc 
shcnwk shfgamvk 
cjshjg nwdcbi 
skfh 
nwvjcnd
skfh dvwuv
fshvur

egfbt hethtn nhnh

gdngng  dehdnnrty

我有许多文件,文件名为 001.txt、002.txt、003.txt 等等。NAMEFILE只需要 001、002、003 等等(不带.txt扩展名)。

答案1

您应该能够使用一个简单的 shell 循环来处理此处文档。例如,给定以下形式的001.txt文件005.txt

$ cat 003.txt 
=== START OF ORIGINAL FILE 003 ===
stuff
more stuff
even more stuff

然后

for i in {001..005}; do cat - "$i.txt" <<EOF >tmpfile
+++ HEADER $i +++
new stuff
more new stuff

EOF
mv tmpfile "$i.txt"
done

生成以下格式的文件

$ cat 003.txt 
+++ HEADER 003 +++
new stuff
more new stuff

=== START OF ORIGINAL FILE 003 ===
stuff
more stuff
even more stuff

等等。

答案2

下面的脚本以递归方式完成该工作。

完全使用您的示例文本:

#!/usr/bin/env python3
import os
import sys

dr = sys.argv[1]

def addlines(file):
    """
    the list below contains the lines, to be added at the top. The lines will
    appear in separate lines. In case you want to add an extra line break, use
    \n like in the last two lines in the example- content below.
    """
    return [
        "abcdgd "+file.replace(".txt", "")+" dhsgabc",
        "shcnwk shfgamvk",
        "cjshjg nwdcbi",
        "skfh",
        "nwvjcnd",
        "skfh dvwuv",
        "fshvur",
        "\negfbt hethtn nhnh",
        "\ngdngng  dehdnnrty",
        ]

for root, dirs, files in os.walk(dr):
    for file in files:
        path = root+"/"+file
        # first read the file and edit its content
        with open(path) as new:
            text = ("\n").join(addlines(file))+"\n"+new.read()
        # then write the edited text to the file
        with open(path, "wt") as out:
            out.write(text)

它更改了一个名为的文件:

Liesje leerde Lotje lopen.txt

内容:

aap
noot

进入:

abcdgd Liesje leerde Lotje lopen dhsgabc
shcnwk shfgamvk
cjshjg nwdcbi
skfh
nwvjcnd
skfh dvwuv
fshvur

egfbt hethtn nhnh

gdngng  dehdnnrty
aap
noot

如何使用

  1. 将脚本复制到一个空文件中,另存为change_file
  2. 在功能中更改addlines(file)文本(但不要触摸+file.replace(".txt", "")+\n代表额外的换行符。
  3. 使用目标目录作为参数(包含文件的目录)运行它:

     python3 /path/to/change_file /directory
    

    如果/directory包含空格,请使用引号:

     python3 /path/to/change_file '/directory'
    

笔记

如果文件确实巨大的,我们可能需要稍微优化一下流程,每行方法,但在一般情况下,这应该可以正常工作。

相关内容