我正在尝试通过 bash 脚本替换'jsp'页面中的一些注释。
我的问题是,随机地删除了一些文件,而其他文件则正确替换了标题。
剧本:
echo "Processed Files:" > processedFiles.txt
for f in $(find . -name "*.jsp")
do
#Check if the file contains the doctype
htmlPage=`cat $f | grep "<!DOCTYPE HTML PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Strict\/\/EN\">"`
oldHtmlPage=`cat $f | grep "<!DOCTYPE HTML PUBLIC \"-\/\/W3C\/\/DTD HTML 3.2\/\/EN\">"`
if [ ${#htmlPage} -gt 0 ] || [ ${#oldHtmlPage} -gt 0 ]
then
echo processing $f
# if read only, allow us to write on it
rdonly=0
if [ ! -w "$f" ]
then
chmod +w "$f"
rdonly=1
fi
# replace headers
if [ ${#htmlPage} -gt 0 ]
then
cat "$f" | sed 's/<!DOCTYPE HTML PUBLIC "-\/\/W3C\/\/DTD HTML 4.0 Strict\/\/EN">/<!DOCTYPE html>/g' > "$f"
fi
if [ ${#oldHtmlPage} -gt 0 ]
then
cat "$f" | sed 's/<!DOCTYPE HTML PUBLIC "-\/\/W3C\/\/DTD HTML 3.2\/\/EN\">/ /g' > "$f"
fi
# add file to list of processed
echo $f'\n' >> processedFiles.txt
# restore read only
if [ $rdonly -eq 1 ]
then
chmod -w $f
fi
else
# jsp without html doctype declaration
echo ignoring $f
fi
done
在某些情况下执行 sed 命令时,内容会被正确替换,但在其他情况下会删除完整内容,因此我注入代码的文件将变为空。
我认为,由于 if 条件,只有包含要替换的标题的文件才会进入该逻辑路径,并且我发现擦除的文件与表现为的文件之间没有区别预期。
我认为如果文件与 sed 表达式不匹配,文件将保持不变(在任何情况下,擦除的文件似乎都包含该标题)
对这个问题的任何想法将不胜感激:)
答案 0 :(得分:4)
这个小片段:
cat "$f" | sed 'something' > "$f"
不是真的一个好主意(同时读取和写入同一个文件)。将数据写入文件可能会干扰读取。
使用sed -i
(就地编辑)可能更安全。
如果您的sed
没有就地编辑,请找一个。或者使用类似的东西:
cat "${f}" | sed 'something' > "${f}-next"
mv -f "${f}-next" "${f}"
而且,如果您重视自己的理智,请在运行这些脚本之前备份整个目录树。