删除body标签前后的html

时间:2019-03-26 19:31:16

标签: bash

  

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

2 个答案:

答案 0 :(得分: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。问题在于,shell在> "{}_nobody"甚至没有机会运行之前就已经看到find。最后,它打开一个名为{}_nobody的文件,并将所有find的输出重定向到该文件,而不是将重定向应用于许多sed的调用。

开始工作有点麻烦。您必须启动一个显式的子外壳,即-看一下:

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的变量。

您可以通过将$1_nobody命令放在自己的脚本中来简化此混乱情况。假设您有从sed读取并写入$1的脚本。那么$2调用将更易于管理:

find

答案 1 :(得分:0)

由于您正在运行* 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_nobody

打印$ 1-打印所有与非贪婪正则表达式(。*?)匹配的内容

/ s-多行正则表达式匹配-https://docstore.mik.ua/orelly/perl/cookbook/ch06_07.htm

示例index.html index.html_nobody将具有相同的内容

<html>
<body><h1>My First Heading</h1>
<p>My first paragraph.</p></body>
</html>

index.html (运行一根衬垫)

<h1>My First Heading</h1>
<p>My first paragraph.</p>