删除正文标记之前和之后的 html



脚本将递归扫描所有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" ;

第二个问题:-oOR 运算符需要括号以确保-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>

最新更新