用用户定义的macOS替换某个短语的所有实例

时间:2016-12-06 23:25:10

标签: macos terminal grep

我有一组不同的静态.html文件。我想以递归方式查看当前文件夹中的所有.html文件,并且:

用用户字符串替换image.jpg的所有实例。

将textBlock1的所有实例替换为另一个用户字符串。

用第三个用户字符串替换textBlock2的所有实例。

其中image.jpg / textBlock1 / textBlock2是唯一完全按照书面形式查找的内容,例如不是tExtblock1

如何使用终端完成此操作?必须在新的macOS安装上工作。

以前的答案不使用用户输入请参阅:Recursive search and replace in text files on Mac and Linux

1 个答案:

答案 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

看起来像这样:

enter image description here