sed случайным образом возвращает пустую строку - PullRequest
1 голос
/ 24 февраля 2012

Я пытаюсь заменить некоторые аннотации на страницах 'jsp' сценарием bash .

Моя проблема заключается в том, что некоторые файлы случайным образом удаляются, а другие имеют заголовок правильноreplace.

Сценарий:

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 в некоторых случаях содержимое корректно заменяется, но в других полное содержимое стирается, поэтомуфайл, в который я вставляю код, становится пустым.

Я предполагаю, что из-за условия если только логические пути, которые содержат заменяемый заголовок, идут в этот логический путь,и я не видел различий между вытертыми файлами и файлами, которые вели себя как ожидалось.

Я предполагаю, что, если файл не будет соответствовать выражению sed , файл останется нетронутым (в любом случае, кажется, что удаленные файлы содержат этот заголовок)

Любая идеяна что может быть проблема будет принята с благодарностью:)

1 Ответ

4 голосов
/ 24 февраля 2012

Этот маленький фрагмент:

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

не на самом деле хорошая идея (чтение и запись в один и тот же файл одновременно). Возможно, что запись данных в файл будет мешать чтению.

Возможно, безопаснее использовать sed -i (редактирование на месте).

Если ваш sed не имеет редактирования на месте, найдите тот, который имеет. Или используйте что-то вроде:

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

И, пожалуйста, если вы цените здравомыслие, сделайте резервные копии всего дерева каталогов, прежде чем запускать сценарии такого рода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...