sed随机返回空字符串

时间:2012-02-24 08:26:00

标签: bash shell sed

我正在尝试通过 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 表达式不匹配,文件将保持不变(在任何情况下,擦除的文件似乎都包含该标题)

对这个问题的任何想法将不胜感激:)

1 个答案:

答案 0 :(得分:4)

这个小片段:

cat "$f" | sed 'something' > "$f"

不是真的一个好主意(同时读取和写入同一个文件)。将数据写入文件可能会干扰读取。

使用sed -i(就地编辑)可能更安全。

如果您的sed没有就地编辑,请找一个。或者使用类似的东西:

cat "${f}" | sed 'something' > "${f}-next"
mv -f "${f}-next" "${f}"

而且,如果您重视自己的理智,请在运行这些脚本之前备份整个目录树。