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