Готовый перевод sed & awk / sed & awk: 4.3 Проверка и сохранение выходных данных
Как говорилось ранее в рабочей области, sed делает следующее:
1. Создает копию входной строки.
2. Изменяет копию в рабочей области.
3. Направляет копию на страндартный вывод.
Это означает, что в sed встроена самозащита и Вы не сделаете изменений на оригинальном файле. Таким образом, следующая команда:
$ sed -f sedscr testfile
не внесет изменений в testfile. Она направит все строки на стандартный вывод (обычно на экран) - как измененные строки, так и не измененные. Вы должны перенаправить вывод в новый файл, если хотите его сохранить.
$ sed -f sedscr testfile > newfile
Символ перенаправления ">" направляет вывод из sed в newfile. Не перенаправляйте вывод из команды во входной файл иначе Вы перезапишите входной файл. Это произойдет до того как sed даже получит шанс обработать файл, эффективно уничтожая данные.
Важной причиной для перенаправления вывода в файл является подтверждение результата. Можно рассмотреть содержание newfile и сравнить его с testfile. Для наиболее методичной проверки результата ( и Вам так следует далать), используйте программу diff для указания на различия между двумя файлами.
$ diff testfile newfile
Эта команда покажет строки уникальные для файла testfile с пердшествующим "<" и строки уникальные для newfile с предшествующим ">". После подтверждения результата, следайте резервную копию оригинального файла и затем используйте команду mv для перезаписи оригинального файла новой версией. Убедитесь, что скрипт редактирования работает правильно до отказа от оригинальной версии.
Так как эти шаги повторяются часто, удобно поместить их в shell скрипт. Хотя мы не можем глубоко внедряться в работу shell скрипта, этот скрипт довольно простой для понимания и использования. Написание shell скрипта связано с использованием текстового редактора для ввода одной или более строк команд в файл, сохранением файле и использованием команды chmod для того, чтобы сделать его исполняемым. Имя файла является именем команды и может быть введено в командной строке. Если Вы не знакомы с shell скриптам, следуйте shell скрипту, представленному в книге как рецепту в который можно вносить собственные изменения.
Следующия два shell скрипта удобны для проверки скриптов sed и применением изменений в постоянный файл. Они особенно удобны когда нужно один скрипт запустить для множества файлов.
4.3.1 testsed
Shell скрипт testsed автоматизирует процесс сохранения вывода sed во временный файл. Он ожидает найти файл скрипта sedscr в текущей директории и применить эти инструкции к входному файлу из командной строки. Вывод помещается во временный файл.
for x
do
sed -f sedscr $x > tmp.$x
done
Имя файла должно быть указано в командной строке. Как результат, этот shell скрипт сохранит вывод во временный файл с префиксом "tmp.". Можно проверить временный файл для определнения правильности произведенных изменений. Если результат подтверждается, можно перезаписать оригинальный файл временным, используя mv.
Можно также объединить команду diff с shell скриптом. (Добавить diff $x после поманды sed.)
Если скрипт не производит ожидаемый результат, запомните, что обычно проще "исправить" скрипт редактирования и запустить его снова на оригинальном входном файле. Не пишите новый скрипт для "отмены" или улучшения изменений во временном файле.
4.3.2 runsed
Shell скрипт runsed разработан для внесения постоянных изменений во входной файл. Другими словами, он используется в случае, когда нужно чтобы входной файл и выходной совпадали. Как testsed, он создает временный файл, но на следующем шаге копирует его поверх оригинального.
#! /bin/sh
for x
do
echo "editing $x: \c"
if test "$x" = sedscr; then
echo "not editing sedscript!"
elif test -s $x; then
sed -f sedscr $x > /tmp/$x$$
if test -s /tmp/$x$$
then
if cmp -s $x /tmp/$x$$
then
echo "file not changed: \c"
else
mv $x $x.bak # save original, just in case
cp /tmp/$x$$ $x
fi
echo "done"
else
echo "Sed produced an empty file\c"
echo " - check your sedscript."
fi
rm -f /tmp/$x$$
else
echo "original file is empty."
fi
done
echo "all done"
Для использования runsed, создайте sed скрипт с названием sedscr в директории, в которой хотите производить редактирование. Подставляйте имя или имена файлов для редактирования в командную строку. Спецсимволы shell могут использоваться для указания набора файлов.
$ runsed ch0?
runsed просто вызывает invokes sed -f sedscr для указанных файлов, по одному за раз и направляет вывод во временный файл. runsed проверяет временный файл, чтобы убедиться, что вывод предоставлен до копирования в оригинальный файл.
Сила этого shell скрипта (строка 9) по сути что и testsed. Дополнительные строки преднозначены для проверки неуспешного запуска - для примера, когда не произведен вывод. Он сравнивает два файла для просмотра были ли изменения на самом деле сделаны или просмотра были ли произведен пустой выходной файл до перезаписи оригинального.
Как правило, runsed не защищает от несовершенных скриптов редактирования. Следует сначала использовать testsed для подтверждения изменений до применения runsed.
Внимание! Этот перевод, возможно, ещё не готов.
Его статус: перевод редактируется
Переведено на Нотабеноиде
http://notabenoid.org/book/32181/117190
Переводчики: r0mk
Настройки
Готово:
