我有一组不同的静态.html文件。我想以递归方式查看当前文件夹中的所有.html文件,并且:
用用户字符串替换image.jpg的所有实例。
将textBlock1的所有实例替换为另一个用户字符串。
用第三个用户字符串替换textBlock2的所有实例。
其中image.jpg / textBlock1 / textBlock2是唯一完全按照书面形式查找的内容,例如不是tExtblock1
如何使用终端完成此操作?必须在新的macOS安装上工作。
以前的答案不使用用户输入请参阅:Recursive search and replace in text files on Mac and Linux
答案 0 :(得分:1)
这个小bash
脚本应该按照您的意愿执行。将其保存为modhtml
并使其可执行,只需要一次,使用:
chmod +x modhtml
然后你可以用:
运行它./modhtml
这是脚本:
#!/bin/bash
echo -n "Enter string1: "
read str1
echo -n "Enter string2: "
read str2
echo -n "Enter string3: "
read str3
echo DEBUG: str1=$str1
echo DEBUG: str2=$str2
echo DEBUG: str3=$str3
# Find all files (not directories), in the current directory and below...
# ... called "*.html" and, for each one, execute "sed" to change...
# ... image.jpg to str1
# ... textBlock1 to str2
# ... textBlock2 to str3
find . -type f -name \*.html -print -exec sed -e "s/image.jpg/$str1/g" -e "s/textBlock1/$str2/g" -e "s/textBlock2/$str3/g" {} \;
就目前而言,它会告诉你它会改变的文件的名称以及它们之后的外观,但实际上并没有改变任何东西。
如果看起来不错 - 首先制作一份文件副本,然后通过将最后一行更改为真实地运行它:
find . -type f -name \*.html -exec sed -i.bak -e "s/image.jpg/$str1/g" -e "s/textBlock1/$str2/g" -e "s/textBlock2/$str3/g" {} \;
如果您希望通过GUI样式提示而不是在终端中提示用户输入字符串,请替换前几行,如下所示:
#!/bin/bash
str1=$(osascript -e 'Tell application "System Events" to display dialog "Enter string1:" default answer ""' -e 'text returned of result' 2>/dev/null)
str2=$(osascript -e 'Tell application "System Events" to display dialog "Enter string2:" default answer ""' -e 'text returned of result' 2>/dev/null)
str3=$(osascript -e 'Tell application "System Events" to display dialog "Enter string3:" default answer ""' -e 'text returned of result' 2>/dev/null)
echo DEBUG: str1=$str1
echo DEBUG: str2=$str2
echo DEBUG: str3=$str3
看起来像这样: