如何使用 bash 脚本递归地用文件夹外的特定文件的内容替换文件夹中所有文件中的字符串?

问题描述 投票:0回答:1

问题:

  • 我有一个文件夹(
    Essays
    )包含许多嵌套的子目录和“
    .txt
    ”文件。
  • 此文件夹中只有some文件在内容中的某处包含字符串'
    [[RepeatedPara]]
    '。
  • 在文件夹外,我有另一个文本文件
    specialPara.txt
    ,其中包含需要替换所有文件中的
    [[RepeatedPara]]
    字符串的段落。
  • 我创建了一个脚本文件“
    addPara.sh
    ”,它应该首先将
    Essays
    的内容复制到新文件夹
    EssaysCopy
    中,然后用
    specialPara.txt
    的内容执行字符串替换。

文件夹结构

.
└── WorkingDir/
    ├── addPara.sh
    ├── specialPara.txt
    ├── EssaysCopy
    └── Essays/
        ├── file-01.txt
        ├── file-02.txt
        ├── file-03.txt
        ├── subDir-01/
        │   ├── file-01-01.txt
        │   ├── file-01-02.txt
        │   └── subSubDir-01-01/
        │       └── file-01-01.txt
        └── subDir-02/
            ├── file-02-01.txt
            └── file-02-02.txt

我到目前为止的脚本:

stackoverflow 上查看答案后,我创建了以下脚本。

    #!/bin/sh

    cp -r Essays EssaysCopy
    cd EssaysCopy
    for FILE in $(find *.txt -type f);
    do
    sed -i -e '/RepeatedPara/{r ../specialPara.txt' -e 'd' -e '}' $FILE
    done

结果:

上面的脚本确实替换了文件夹

RepeatedPara
的所有文件中包含字符串
EssaysCopy
的行,但不处理嵌套子目录中的文件。

我用来创建嵌套目录和文件进行测试的脚本:

    #!/bin/sh

    mkdir Essays
    cd Essays
    for i in {1..3}
    do
    mkdir subDir-$i
    cd subDir-$i
    for j in {1..2}
    do
        mkdir subDir-$j
        cd subDir-$j
        for k in {1..2}
        do
            echo "Some Content at the begining" > file-$i-$j-$k.txt
            echo "[[RepeatedPara]]" >> file-$i-$j-$k.txt
            echo "Some Content at the End" >> file-$i-$j-$k.txt
        done
        cd ..
    done
    for l in {1..2}
    do
        echo "Some Content at the begining" > file-$i-$l.txt
        echo "[[RepeatedPara]]" >> file-$i-$l.txt
        echo "Some Content at the End" >> file-$i-$l.txt
    done
    cd ..
    done
    for m in {1..2}
    do
        echo "Some Content at the begining" > file-$m.txt
        echo "[[RepeatedPara]]" >> file-$m.txt
        echo "Some Content at the End" >> file-$m.txt
    done
    cd ..
bash shell awk sed replace
1个回答
0
投票

如果是

bash
脚本,请使用
bash
shebang.

然后应该使用find的

-exec
并引用glob表达式:

    #!/bin/bash

    cp -r Essays EssaysCopy
    cd EssaysCopy
    find . -type f -name "*.txt" -exec \
      sed -i -e '/RepeatedPara/{r ../specialPara.txt' -e 'd' -e '}' {} \;

假设,正如您提到的那样,您的

sed
命令按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.