用可变字符串替换字符串
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> → <a href="page1.php">Page 1</a>
→ 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> → <a href="page1.php">Page 1</a>
→ 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 脚本进入流程。
我有两个目录,S 和 T,每个目录有 150 个文件。文件名相同,例如,如果 S 包含文件 1、文件 2、...、文件 150,则 T 也包含文件 1、文件 2、...、文件 150。 S 中的每个文件都包含以下代码:
<a href="index.php">Home</a> → <a href="page1.php">Page 1</a>
→ 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> → <a href="page1.php">Page 1</a>
→ 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 脚本进入流程。