Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Утилиты для работы с файлами произвольного типа






 

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

 

1. Копирование файла (в MS-DOS – сору):

ср исходный файл конечный файл (или каталог)

 

Примеры:

а) # cat fa б) # ls 2

aaaaaaa 3 fx fy

# cat fb # cp fa 2

bbbbbbb # ls 2

# cp fa fb 3 fa fx fy

# cat fb #

aaaaaaa

#

 

Следует отметить, что при любом копировании создается не новая жесткая связь (связи), а создается новый файл (файлы). Так, при копировании из файла в каталог в последнем создается новая запись, состоящая из простого имени исходного файла и из системного номера нового файла. При ранее рассматривавшемся копировании из каталога в каталог копируются все файлы (в том числе и подкаталоги) из исходного каталога в конечный каталог. При этом для каждого копируемого файла создается новый файл с точно таким же содержимым, после чего новый файл регистрируется в конечном каталоге.

В примере (а) файл fa копируется в тот же каталог, но под другим именем. Файл, существовавший прежде под этим именем, уничтожается. В примере (б) файл fa копируется в подкаталог 2 под своим именем.

 

2. Переименование файлов и их перемещение (вMS-DOS – rename, move):

mv исходныйфайл (или каталог) конечный файл (или каталог)

 

Если исходный и конечный файлы находятся в одном и том же каталоге, то данная утилита заменяет имя исходного файла на имя конечного файла. Если же эти файлы находятся в разных каталогах, то производится «перемещение» файла по файловой структуре системы. При этом запись файла в исходном каталоге уничтожается, а точно такая же запись в конечном каталоге, наоборот, создается. Если в качестве первого операнда задан файл, а в качестве второго – каталог, то также производится перемещение файла в заданный каталог. Если в качестве обоих операндов заданы имена каталогов, то производится переименование каталога, соответствующего первому операнду.

Примеры:

а) # ls б) # ls

fa fb 2 5 fa

# mv fb fx # ls 2

# ls 3 fx fy

fa fx # mv fa 2

# # ls 2

3 fa fx fy

#

В примере (а) файл fb переименован в fx. А в примере (б) файл fa перемещен в подкаталог 2 текущего каталога.

 

3. Удаление файлов (в MS-DOS – del):

rm файлы

Это уже знакомая нам команда rm, но без флага -r. Параметрами команды являются имена удаляемых файлов. Другие флаги:

-f – удаление файлов без запроса подтверждения;

-i – обязательный запрос подтверждения при удалении каждого файла.

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

Примеры:

а) # ls б) # ls

fa fb fx fy fa fb fx fy

# rm fb fx # rm –i fb fx

# ls rm: remove 'fb'? y

fa fy rm: remove 'fx'? n

# # ls

fa fx fy

#

В примере (а) произведено удаление файлов fb и fx без запроса подтверждения на удаление файла. В примере (б) такое удаление произведено с запросами. При этом файл fb был удален, a fx – нет.

 

4. Создание жестких и символических связей (вMS-DOSотсутствует):

ln исходный_файл файл_ссылка (или каталог)

 

Эта команда создает новую связь с исходным файлом. При отсутствии флага -s создается жесткая связь с этим файлом. В этом случае файл-ссылка представляет собой новое имя уже существующего файла. Если в качестве второго параметра команды задано не имя файла, а имя каталога, то в этом каталоге исходный файл будет зарегистрирован под своим простым прежним именем. При наличии флага -s создаваемый файл-ссылка представляет собой символическую связь с исходным файлом.

 

4.2 Текстовый редактор sed

 

Это строковый пакетный редактор. Термин «строковый» означает, что редактирование текста производится построчно. При этом, выполнив преобразование текущей строки, нельзя в этом же сеансе работы редактора вернуться к редактированию одной из ранее пройденных строк. Термин «пакетный» означает, что редактирование очередной строки текста осуществляется путем выполнения пакета (списка) команд редактора sed, заданных при его запуске.

Мы будем использовать далее следующий формат команды UNIX, выполняющей запуск sed:

 

# sed файл 1... файл n -е {"

> команда 1

.....................

> команда m

> " }

Данная команда sed выполняет редактирование текстовых файлов 1...n. При этом сначала последовательно редактируются строки первого файла, затем строки второго файла и так далее до файла п. Вместо имени файла можно записать символ «–», который означает, что часть исходного текста вводится с клавиатуры (вспомним, что в UNIX клавиатура также является файлом). Если имена файлов отсутствуют вовсе, то исходный текст полностью вводится с клавиатуры.

Флаг используется для задания пакета команд, предназначенного для редактирования каждой текстовой строки. Этот пакет заключен между символами '{'и '}', а также между символами ' " ' и ' " '. Обратим внимание, что каждая команда редактора расположена на отдельной строке. На отдельной строке находятся также завершающие символы команды ' " } '.

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

Как и в любой команде shell, занимающей более одной строки экрана, первая строка начинается с первичного приглашения shell в виде символа «$» или " # ", а каждая последующая строка начинается с вторичного приглашения в виде символа «>».

Далее при рассмотрении команд редактора sed мы будем использовать два простых текстовых файла – fl и f2:

# cat f1

1 22 333

4444 55555

# cat f2

xxxxx

yyyyy

4.2.1 Команда вывода номера текущей строки: «=».

 

Если перед этой командой записать число, то будет пронумерована только строка, номер которой совпадает с этим числом. Если число отсутствует, то будут выведены номера всех строк.

Пример

# sed f1 f2 -е {"

> =

> 2 =

> " }

1

1 22 333

2

2

4444 55555

3

ххххх

4

УУУУУ

#

В этом примере все строки обрабатываются первой командой «=», а строка 2 обрабатывается не только первой, но и второй командой. Поэтому она пронумерована дважды.

 

4.2.2 Команда добавления текста, вводимого с клавиатуры, после заданной строки:

a\

текст

 

Как идля предыдущей команды, номер требуемой строки предшествует команде. Если он опущен, то вставка выполняется после каждой из строк.

Примеры:

а) # sed f1 -е {"

> a\\

> 88888\

> 99999

> 1 a\\

> " }

1 22 333

8888899999

sssss

4444 55555

8888899999

#

б) # sed f1 -е {"

> a\\

> 88888\\

> 99999

> 1 a\\

> sssss

> " }

1 22 333

88888

99999

sssss

4444 55555

88888

99999

#

Оба примера выполняют добавление первого текста после каждой из введенных строк, а второго текста – только после строки 1. Результат добавления первого из этих текстов в обоих примерах получился разный: в (а) это одна строка, а в (б) – две строки. Причиной такого различия является третья командная строка. В (а) она заканчивается одним символом «\», а в (б) – двумя. Кроме того, обратим внимание, что в обоих примерах команда sed -а заканчивается не одним, а двумя символами «\». Причиной обеих этих особенностей является та роль, которую играет символ «\» для shell и для sed.

Напомним, что все, что набрано после символа «$» или " #", пред­ставляет собой команду shell и поэтому подвергается его обработке. Эта обработка, в частности, заключается в том, что shell обрабатывает свои специальные символы (метасимволы), одним из которых является символ «\». Причем этот символ имеет для shell двойной смысл.

Во-первых, если «\» стоит в конце командной строки, то это означает, что на следующей строке пользователь набрал продолжение текущей shell -команды. Поэтому shell убирает из командной строки и символ «\» (он сделал свое дело), и символ «конец строки», который является результатом нажатия пользователем клавиши < Enter>.

Во-вторых, символ «\» рассматривается shell как «экранирующий» символ. Это означает, что если «\» записан в командной строке непосредственно перед метасимволом shell, например перед символом «*», то он утрачивает свое специальное значение (для «*» это подстановка любой символьной строки) и оставляется shell в командной строке как обычный алфавитно-цифровой символ. Так как «\» является метасимволом, то запись «\\» означает, что shell должен оставить «\» в командной строке как обычный символ.

В рассматриваемом примере используется еще одна пара «экранирующих» символов: «"» и «"». «Экранирующее» действие этих символов более слабое по сравнению с «\»: лишь некоторые метасимволы, заключенные между двойными кавычками, теряют свой специальный смысл. Например, символ «>» перестает быть метасимволом, а «\» им остается.

После того как shell сделает требуемые подстановки, он выполнит запуск исполняемого файла (у нас это sed), передав на вход запускаемой программы параметры командной строки, полученные shell в результате преобразования метасимволов. В рассматриваемом примере shell передаст на вход sed следующее:

a) f1 -е {

a\

8888899999

1 a\

sssss

}

б) f1 -е {

a\

88888\

99999

1 a\

sssss

}

Для sed символ «\» также является метасимволом, имеющим единственное значение: его запись в конце строки означает, что команда sed будет продолжена на следующей строке. В варианте (а) команда добавления a занимает две, а в варианте (б) – три строки. Заметим, что символы «{» и «}» также являются для sed специальными, обозначая начало и конец пакета команд.

 

4.2.3 Команда добавления текста, вводимого с клавиатуры, перед заданной строкой:

i\

текст

 

Эта команда очень похожа на рассмотренную выше команду а. Единственное отличие: текст добавляется не после, а перед заданной строкой.

 

4.2.4 Замена строки иди группы строк заданным текстом:

c\

текст

 

Перед командой c можно задать одно число или два числа, разделенных запятой. Если указано одно число, то будет заменена только одна строка с этим номером. Если указаны два числа, то будут заменены все строки в диапазоне номеров между этими числами включительно. Если числа перед командой вообще не заданы, то все исходные строки будут заменены заданным текстом. Остальные детали применения этой команды аналогичны командам а и i.

Примеры:

а) # sed f1 f2 –e {"

> 2 c\\

> ooooooo\\

> uuuuuuu

" }

1 22 333

ooooooo

uuuuuuu

xxxxx

yyyyy

#

 

б) # sed f1 f2 –e {"

> 1, 3 c\\

> ooooooo\\

> uuuuuuu

" }

ooooooo

uuuuuuu

yyyyy

#

 

4.2.5 Удаление заданных строк: d.

 

Номера удаляемых строк задаются одним или двумя числами аналогично команде с. Если номера не заданы, то команда d удаляет все редактируемые строки.

 

Примеры:

а) # sed f1 f2 –e {"

> 1 d

> " }

4444 55555

xxxxx

yyyyy

#

б) # sed f1 f2 –e {"

> 1, 3 d

> " }

yyyyy

#

4.2.6 Замена некоторой последовательности символов 1 на требуемую последовательность 2:

s \последовательность 1\последовательность 2\ pgw

 

Модификаторы команды р, g, w необязательны и используются в следующих случаях:

р – редактируемая строка выводится (на экран или в файл) повторно в том случае, если требуемая замена успешно выполнена. Если команда вызова sed имеет дополнительный флаг -n, то выводятся только те строки, в которых произошла замена;

g – требуется выполнить замену столько раз, сколько заменяемая последовательность символов встретится в редактируемой строке. При отсутствии этого модификатора замена производится только один раз;

w – в случае успешной замены редактируемая строка записывается в файл, имя которого задается через пробел после этого модификатора.

Подобно командам c и d, команде s могут предшествовать одно или два числа, задающие строки, в которых выполняется замена. Если ни одно число не записано, то замена производится во всех строках.

Примеры:

а) # sed f1 -е {" б) # sed f1 -е {"

> s\55\n\\ > s\55\n\g

> " } > " }

1 22 333 1 22 333

4444 n555 4444 nn5

# #

В примере (а) выполнена замена одной пары символов «55», а в примере (б) — замена двух пар. Обратим внимание, что в (а) вторая командная строка завершается двумя символами " \", потому что один из них используется для экранирования другого (см. команду а);

в) # sed f1 -е {" г) # sed f1 -n -е {"

> s\4 5\а b с\р > s\4 5\а b с\р

> " } > " }

1 22 333 444a b c5555

444a b с5555 #

444а b c5555

#

В примере (в) выполняется добавочный вывод строки, в которой произошла замена. В примере (г) благодаря флагу -n и модификатору р выполняется вывод только той строки, в которой произошла замена. Обратите внимание, что заменяемая и замещающая последовательности символов могут содержать пробелы;

д) # sed f1 -е {" е) # sed f1 -n -е {"

> s\44\8\gw f3 > s\44\8\pgw f4

> " } > " }

1 22 333 88 55555

88 55555 # cat f4

# cat f3 88 55555

88 55555 #

#

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

4.2.7. Запись редактируемых строк в файл: w файл

 

Эта команда (не путать с одноименным модификатором команды s) выполняет запись требуемых строк в заданный файл. Указание строк производится одним или двумя числами аналогично команде с. Если числа не заданы, в файл записываются все строки обрабатываемого текста.

Примеры:

 

а) # sed f1 f2 -е {"

> 2, 3 w f5

> s\4\A\g

> " }

1 22 333

AAAA 55555

xxxxx

yyyyy

#cat f5

4444 55555

xxxxx

#

 

б) # sed f1 f2 -е {"

> s\4\A\g

> 2, 3 w f6

> " }

1 22 333

AAAA 55555

xxxxx

yyyyy

#cat f6

AAAA 55555

xxxxx

#

 

В примере (а) на экран выводятся все строки с выполненной заменой символа «4» на «А», но в файл f5 записаны строки без подстановки. Это объясняется тем, что команда w предшествует команде s. Поменяв эти команды местами (пример (б)), получим файл f6 с выполненными заменами. Это является иллюстрацией того факта, что каждая исходная строка обрабатывается командами sed в том порядке, в котором эти команды записаны.

Везде ранее мы обрабатывали исходный текст теми командами sed, которые тут же вводили с клавиатуры. То же самое можно сделать с помощью команд, заранее записанных в некоторый текстовый файл на диске. Подобный командный файл обрабатывается sed подобно тому, как скрипт обрабатывается shell. Для задания командного файла в команде вызова sed следует использовать флаг -f:

# sed файл 1... файл п -f командный файл

#

При записи команд sed в командный файл следует учитывать, что они могут отличаться от соответствующих команд, вводимых с командной строки. Такое различие обусловлено тем, что командный файл для sed не обрабатывается shell, а поступает непосредственно в sed. Поэтому символы «\», добавлявшиеся нами для экранирования от воздействия shell, теперь не нужны.

Примеры. Любой из рассмотренных ранее примеров можно переделать в пример по применению командных файлов. Сделаем это для: 1) пример (а) для пояснения команды а; 2) пример (б) для пояснения команды c:

а) # cat > s1 б) # cat > s2

a\ 1, 3 c\

88888\ ooooooo\

99999 uuuuuuu

1 a\ < Ctrl> & < D>

sssss # sed f1 f2 –f s2

< Ctrl> & < D> oooooooo

# sed f1 –f s1 uuuuuuu

1 22 333 yyyyy

88888 #

99999

#

Допускается совместное применение флагов -e и -f в команде вызова sed. При этом сначала sed выполняет команды, введенные с клавиатуры, а затем команды из файла.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.