sed & awk / sed & awk: 4.3 Проверка и сохранение выходных данных

Оглавление
← →
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

Как говорилось ранее в рабочей области, sed делает следующее:

r0mk 07.01.13 в 21:54

0

1. Создает копию входной строки.

r0mk 09.01.13 в 11:42

0

2. Изменяет копию в рабочей области.

r0mk 09.01.13 в 11:42

0

3. Направляет копию на страндартный вывод.

r0mk 09.01.13 в 11:43

0

Это означает, что в sed встроена самозащита и Вы не сделаете изменений на оригинальном файле. Таким образом, следующая команда:

r0mk 09.01.13 в 11:44

0

$ sed -f sedscr testfile

r0mk 09.01.13 в 11:44

0

не внесет изменений в testfile. Она направит все строки на стандартный вывод (обычно на экран) - как измененные строки, так и не измененные. Вы должны перенаправить вывод в новый файл, если хотите его сохранить.

r0mk 09.01.13 в 11:49

0

$ sed -f sedscr testfile > newfile

r0mk 09.01.13 в 11:49

0

Символ перенаправления ">" направляет вывод из sed в newfile. Не перенаправляйте вывод из команды во входной файл иначе Вы перезапишите входной файл. Это произойдет до того как sed даже получит шанс обработать файл, эффективно уничтожая данные.

r0mk 09.01.13 в 11:52

0

Важной причиной для перенаправления вывода в файл является подтверждение результата. Можно рассмотреть содержание newfile и сравнить его с testfile. Для наиболее методичной проверки результата ( и Вам так следует далать), используйте программу diff для указания на различия между двумя файлами.

r0mk 09.01.13 в 11:55

0

$ diff testfile newfile

r0mk 09.01.13 в 11:56

0

Эта команда покажет строки уникальные для файла testfile с пердшествующим "<" и строки уникальные для newfile с предшествующим ">". После подтверждения результата, следайте резервную копию оригинального файла и затем используйте команду mv для перезаписи оригинального файла новой версией. Убедитесь, что скрипт редактирования работает правильно до отказа от оригинальной версии.

r0mk 09.01.13 в 12:05

0

Так как эти шаги повторяются часто, удобно поместить их в shell скрипт. Хотя мы не можем глубоко внедряться в работу shell скрипта, этот скрипт довольно простой для понимания и использования. Написание shell скрипта связано с использованием текстового редактора для ввода одной или более строк команд в файл, сохранением файле и использованием команды chmod для того, чтобы сделать его исполняемым. Имя файла является именем команды и может быть введено в командной строке. Если Вы не знакомы с shell скриптам, следуйте shell скрипту, представленному в книге как рецепту в который можно вносить собственные изменения.

r0mk 09.01.13 в 12:11

0

Следующия два shell скрипта удобны для проверки скриптов sed и применением изменений в постоянный файл. Они особенно удобны когда нужно один скрипт запустить для множества файлов.

r0mk 09.01.13 в 12:13

0

4.3.1 testsed

r0mk 09.01.13 в 12:13

0

Shell скрипт testsed автоматизирует процесс сохранения вывода sed во временный файл. Он ожидает найти файл скрипта sedscr в текущей директории и применить эти инструкции к входному файлу из командной строки. Вывод помещается во временный файл.

r0mk 09.01.13 в 12:17

0

for x

r0mk 09.01.13 в 12:17

0

do

r0mk 09.01.13 в 12:17

0

sed -f sedscr $x > tmp.$x

r0mk 09.01.13 в 12:17

0

done

r0mk 09.01.13 в 12:17

0

Имя файла должно быть указано в командной строке. Как результат, этот shell скрипт сохранит вывод во временный файл с префиксом "tmp.". Можно проверить временный файл для определнения правильности произведенных изменений. Если результат подтверждается, можно перезаписать оригинальный файл временным, используя mv.

r0mk 10.01.13 в 04:40

0

Можно также объединить команду diff с shell скриптом. (Добавить diff $x после поманды sed.)

r0mk 10.01.13 в 04:42

0

Если скрипт не производит ожидаемый результат, запомните, что обычно проще "исправить" скрипт редактирования и запустить его снова на оригинальном входном файле. Не пишите новый скрипт для "отмены" или улучшения изменений во временном файле.

r0mk 10.01.13 в 04:53

0

4.3.2 runsed

r0mk 10.01.13 в 04:54

0

Shell скрипт runsed разработан для внесения постоянных изменений во входной файл. Другими словами, он используется в случае, когда нужно чтобы входной файл и выходной совпадали. Как testsed, он создает временный файл, но на следующем шаге копирует его поверх оригинального.

r0mk 10.01.13 в 04:57

0

#! /bin/sh

r0mk 10.01.13 в 04:57

0

for x

r0mk 10.01.13 в 04:57

0

do

r0mk 10.01.13 в 04:57

0

echo "editing $x: \c"

r0mk 10.01.13 в 04:57

0

if test "$x" = sedscr; then

r0mk 10.01.13 в 04:57

0

echo "not editing sedscript!"

r0mk 10.01.13 в 04:57

0

elif test -s $x; then

r0mk 10.01.13 в 04:58

0

sed -f sedscr $x > /tmp/$x$$

r0mk 10.01.13 в 04:58

0

if test -s /tmp/$x$$

r0mk 10.01.13 в 04:58

0

then

r0mk 10.01.13 в 04:58

0

if cmp -s $x /tmp/$x$$

r0mk 10.01.13 в 04:58

0

then

r0mk 10.01.13 в 04:58

0

echo "file not changed: \c"

r0mk 10.01.13 в 04:58

0

else

r0mk 10.01.13 в 04:58

0

mv $x $x.bak # save original, just in case

r0mk 10.01.13 в 04:58

0

cp /tmp/$x$$ $x

r0mk 10.01.13 в 04:58

0

fi

r0mk 10.01.13 в 04:58

0

echo "done"

r0mk 10.01.13 в 04:58

0

else

r0mk 10.01.13 в 04:58

0

echo "Sed produced an empty file\c"

r0mk 10.01.13 в 04:59

0

echo " - check your sedscript."

r0mk 10.01.13 в 04:59

0

fi

r0mk 10.01.13 в 04:59

0

rm -f /tmp/$x$$

r0mk 10.01.13 в 04:59

0

else

r0mk 10.01.13 в 04:59

0

echo "original file is empty."

r0mk 10.01.13 в 04:59

0
Минутку...

Следующая страница →