用可变字符串替换字符串

substituting a string with a variable string

我有两个目录,S 和 T,每个目录有 150 个文件。文件名相同,例如,如果 S 包含文件 1、文件 2、...、文件 150,则 T 也包含文件 1、文件 2、...、文件 150。 S 中的每个文件都包含以下代码:

<a href="index.php">Home</a>  &rarr; <a href="page1.php">Page 1</a> 
&rarr;  NAME1  <a href="A.php"> &rarr Previous</a> <a href="B.php">Next  &rarr </a>

在所有 150 个文件中,除了 NAME1 之外的所有内容都相同,即 NAME2 用于文件 2,NAME3 用于文件 3,等等

T 中的每个文件都包含此代码:

<a href="index.php">Home</a>  &rarr; <a href="page1.php">Page 1</a> 
&rarr;  STRING1  <a href="X1.php"> &rarr Previous</a> <a href="Y1.php">Next  &rarr </a>

其中file1的STRING1,file2的STRING2等是(相当长的)其他代码的字符串,每个文件都有变化,X1,Y1也每个文件不同,分别是X2,Y2 for file2,X3 , 文件 3 的 Y3 等

我想编写一个 shell 脚本,将 T/file1 中的字符串 X1、Y1 替换为 S/file1 中的字符串 A、B、X2、Y2 T/file2 用于 S/file2 中的字符串 A、B,依此类推。我正在 Mac 或 Ubuntu 计算机上使用任一终端。我已经在网上和这个论坛上进行了搜索,并尝试使用 sed 和 awk,但我无法正常工作。 感谢您的帮助或建议。

我将举一个只有两个文件而不是 150 个文件的例子。 假设我已经准备好了脚本。在我执行脚本之前,目录 S 有文件 file1,内容为

N1 A B

和文件 file2 的内容

N2 A B

而目录 T 有文件 file1,内容为

S1 X1 Y1

和文件 file2 的内容

S2 X2 Y2

执行脚本后,S 有文件 file1,内容为

N1 X1 Y1

和文件 file2 的内容

N2 X2 Y2

目录T不变。

我希望在 运行 脚本时对所有 150 个文件都执行此操作。

这样的事情可能是最简单的:

for path in S/*; do
    file="${path#*/}"
    awk '
        NR==FNR { =""; vals[NR]=[=10=]; next }
        { print  vals[FNR] }
    ' "T/$file" "S/$file" > tmp &&
    mv tmp "S/$file"
done

对于像您发布的最后一个示例这样微不足道的事情,您不需要像那样使用 awk,但从您的原始示例来看,您似乎需要进行一些更复杂的处理,所以我展示了在何处安装 awk 脚本进入流程。