脚本将递归扫描所有html和htm页面 从指定为参数的位置。其次,对于每个文件 删除
<body>
之前的所有内容以及</body>
包括<body>
和</body>
。第三,结果应该 保存在另一个文件中,例如原始文件称为index.html
,它就变成了index.html_nobody
。
我写了这段代码,但它没有给出预期的结果。 预期结果是脚本创建新文件,其中包含新内容。截至目前,它只创建一个名为{}_nobody
的文件并将其留空。
#!/bin/bash
for file in $( ls $1 -r );
do
if [ -d $file ];
then
find -type f -name "*.html" -o -name "*.htm" -exec sed -e '1,/<body/ s/.*/ /' -e '/</body>/,$ s/.*/ /' "{}" > "{}_nobody" ;
echo "Success!"
exit 0
fi
done
echo "Unvalid path, please try again."
exit 0
第一个问题:你不需要循环或if
语句。find
已经通过目录树递归,因此您所要做的就是调用它一次。传递"$1"
作为其第一个参数,使其在那里搜索。
find "$1" -type f -name "*.html" -o -name "*.htm"
-exec sed -e '1,/<body/ s/.*/ /' -e '/</body>/,$ s/.*/ /' "{}" > "{}_nobody" ;
第二个问题:-o
OR 运算符需要括号以确保-exec
适用于两个分支。
find "$1" -type f '(' -name "*.html" -o -name "*.htm" ')'
-exec sed -e '1,/<body/ s/.*/ /' -e '/</body>/,$ s/.*/ /' "{}" > "{}_nobody" ;
第三个问题:像>
这样的重定向不适用于find -exec
。问题是外壳在find
有机会运行之前就看到了> "{}_nobody"
。它最终会打开一个名为{}_nobody
的文件并将 find 的所有输出重定向到该文件,而不是将重定向应用于许多sed
调用。
让它工作有点毛茸茸的。你必须启动一个显式的子shell,它是 - 好吧,看看:
find "$1" -type f '(' -name "*.html" -o -name "*.htm" ')'
-exec bash -c 'sed -e "1,/<body/ s/.*/ /" -e "/</body>/,$ s/.*/ /" "$1" > "${1}_nobody"' -- {} ;
要理解这一点,请将其阅读为-exec bash -c '<script>' -- {} ;
.以下-c '<script>'
是脚本的参数:$0
、$1
、$2
等。我们不在乎$0
是什么,所以惯例是通过--
。我们将$1
设置为{}
,这是正在处理的文件的名称。
然后你会看到在脚本中$1
使用了两次。第二次用大括号括起来,以确保 bash 认为您没有一个名为$1_nobody
的变量。
您可以通过将sed
命令放在其自己的脚本中来简化这种混乱。假设您让该脚本从$1
读取并写入$2
。那么find
调用将更易于管理:
find "$1" -type f '(' -name "*.html" -o -name "*.htm" ')'
-exec ./stripHtml {} {}_nobody ;
由于您运行的是类似 *nix 的操作系统,并且可能安装了 Perl,因此您可以运行一个简单的一行,它将提取您想要的值并创建一个扩展名为"_nobody"的备份副本:
$ perl -n0777 -i_nobody -e 'print $1 if /<body>(.*?)</body>/s' index.html
-n 添加 while 循环
-0 777 导致文件出现模糊
-i index.html 现已编辑,原始内容被放置在 index.html_none
打印 $1 - 打印与非贪婪正则表达式匹配的所有内容 (.*?
/s - 多行正则表达式匹配 - https://docstore.mik.ua/orelly/perl/cookbook/ch06_07.htm
示例索引.html索引.html_没有人将具有相同的内容
<html>
<body><h1>My First Heading</h1>
<p>My first paragraph.</p></body>
</html>
索引.html运行一行后
<h1>My First Heading</h1>
<p>My first paragraph.</p>