sed & awk / sed & awk: 4.3 Проверка и сохранение выходных данных
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Как говорилось ранее в рабочей области, sed делает следующее: r0mk 07.01.13 в 21:54 |
|
|
1. Создает копию входной строки. r0mk 09.01.13 в 11:42 |
||
|
2. Изменяет копию в рабочей области. r0mk 09.01.13 в 11:42 |
||
|
3. Направляет копию на страндартный вывод. r0mk 09.01.13 в 11:43 |
||
|
Это означает, что в sed встроена самозащита и Вы не сделаете изменений на оригинальном файле. Таким образом, следующая команда: r0mk 09.01.13 в 11:44 |
||
|
$ sed -f sedscr testfile r0mk 09.01.13 в 11:44 |
||
|
не внесет изменений в testfile. Она направит все строки на стандартный вывод (обычно на экран) - как измененные строки, так и не измененные. Вы должны перенаправить вывод в новый файл, если хотите его сохранить. r0mk 09.01.13 в 11:49 |
||
|
$ sed -f sedscr testfile > newfile r0mk 09.01.13 в 11:49 |
||
|
Символ перенаправления ">" направляет вывод из sed в newfile. Не перенаправляйте вывод из команды во входной файл иначе Вы перезапишите входной файл. Это произойдет до того как sed даже получит шанс обработать файл, эффективно уничтожая данные. r0mk 09.01.13 в 11:52 |
||
|
Важной причиной для перенаправления вывода в файл является подтверждение результата. Можно рассмотреть содержание newfile и сравнить его с testfile. Для наиболее методичной проверки результата ( и Вам так следует далать), используйте программу diff для указания на различия между двумя файлами. r0mk 09.01.13 в 11:55 |
||
|
$ diff testfile newfile r0mk 09.01.13 в 11:56 |
||
|
Эта команда покажет строки уникальные для файла testfile с пердшествующим "<" и строки уникальные для newfile с предшествующим ">". После подтверждения результата, следайте резервную копию оригинального файла и затем используйте команду mv для перезаписи оригинального файла новой версией. Убедитесь, что скрипт редактирования работает правильно до отказа от оригинальной версии. r0mk 09.01.13 в 12:05 |
||
|
Так как эти шаги повторяются часто, удобно поместить их в shell скрипт. Хотя мы не можем глубоко внедряться в работу shell скрипта, этот скрипт довольно простой для понимания и использования. Написание shell скрипта связано с использованием текстового редактора для ввода одной или более строк команд в файл, сохранением файле и использованием команды chmod для того, чтобы сделать его исполняемым. Имя файла является именем команды и может быть введено в командной строке. Если Вы не знакомы с shell скриптам, следуйте shell скрипту, представленному в книге как рецепту в который можно вносить собственные изменения. r0mk 09.01.13 в 12:11 |
||
|
Следующия два shell скрипта удобны для проверки скриптов sed и применением изменений в постоянный файл. Они особенно удобны когда нужно один скрипт запустить для множества файлов. r0mk 09.01.13 в 12:13 |
||
|
4.3.1 testsed r0mk 09.01.13 в 12:13 |
||
|
Shell скрипт testsed автоматизирует процесс сохранения вывода sed во временный файл. Он ожидает найти файл скрипта sedscr в текущей директории и применить эти инструкции к входному файлу из командной строки. Вывод помещается во временный файл. r0mk 09.01.13 в 12:17 |
||
|
for x r0mk 09.01.13 в 12:17 |
||
|
do r0mk 09.01.13 в 12:17 |
||
|
sed -f sedscr $x > tmp.$x r0mk 09.01.13 в 12:17 |
||
|
done r0mk 09.01.13 в 12:17 |
||
|
Имя файла должно быть указано в командной строке. Как результат, этот shell скрипт сохранит вывод во временный файл с префиксом "tmp.". Можно проверить временный файл для определнения правильности произведенных изменений. Если результат подтверждается, можно перезаписать оригинальный файл временным, используя mv. r0mk 10.01.13 в 04:40 |
||
|
Можно также объединить команду diff с shell скриптом. (Добавить diff $x после поманды sed.) r0mk 10.01.13 в 04:42 |
||
|
Если скрипт не производит ожидаемый результат, запомните, что обычно проще "исправить" скрипт редактирования и запустить его снова на оригинальном входном файле. Не пишите новый скрипт для "отмены" или улучшения изменений во временном файле. r0mk 10.01.13 в 04:53 |
||
|
4.3.2 runsed r0mk 10.01.13 в 04:54 |
||
|
Shell скрипт runsed разработан для внесения постоянных изменений во входной файл. Другими словами, он используется в случае, когда нужно чтобы входной файл и выходной совпадали. Как testsed, он создает временный файл, но на следующем шаге копирует его поверх оригинального. r0mk 10.01.13 в 04:57 |
||
|
#! /bin/sh r0mk 10.01.13 в 04:57 |
||
|
for x r0mk 10.01.13 в 04:57 |
||
|
do r0mk 10.01.13 в 04:57 |
||
|
echo "editing $x: \c" r0mk 10.01.13 в 04:57 |
||
|
if test "$x" = sedscr; then r0mk 10.01.13 в 04:57 |
||
|
echo "not editing sedscript!" r0mk 10.01.13 в 04:57 |
||
|
elif test -s $x; then r0mk 10.01.13 в 04:58 |
||
|
sed -f sedscr $x > /tmp/$x$$ r0mk 10.01.13 в 04:58 |
||
|
if test -s /tmp/$x$$ r0mk 10.01.13 в 04:58 |
||
|
then r0mk 10.01.13 в 04:58 |
||
|
if cmp -s $x /tmp/$x$$ r0mk 10.01.13 в 04:58 |
||
|
then r0mk 10.01.13 в 04:58 |
||
|
echo "file not changed: \c" r0mk 10.01.13 в 04:58 |
||
|
else r0mk 10.01.13 в 04:58 |
||
|
mv $x $x.bak # save original, just in case r0mk 10.01.13 в 04:58 |
||
|
cp /tmp/$x$$ $x r0mk 10.01.13 в 04:58 |
||
|
fi r0mk 10.01.13 в 04:58 |
||
|
echo "done" r0mk 10.01.13 в 04:58 |
||
|
else r0mk 10.01.13 в 04:58 |
||
|
echo "Sed produced an empty file\c" r0mk 10.01.13 в 04:59 |
||
|
echo " - check your sedscript." r0mk 10.01.13 в 04:59 |
||
|
fi r0mk 10.01.13 в 04:59 |
||
|
rm -f /tmp/$x$$ r0mk 10.01.13 в 04:59 |
||
|
else r0mk 10.01.13 в 04:59 |
||
|
echo "original file is empty." r0mk 10.01.13 в 04:59 |
