П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 180128 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 78197 раз(а).

Учебник HTML.
Просмотров 75548 раз(а).

Руководство по PHP5.
Просмотров 46599 раз(а).

Хостинг через призму DNS.
Просмотров 54000 раз(а).

Подборка текстов стандартных документов.
Просмотров 46522 раз(а).

Учебник PHP - Самоучитель
Просмотров 52678 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 53276 раз(а).

Внешние атаки...
Просмотров 43077 раз(а).

Учебник PHP.
Просмотров 38656 раз(а).

SSI в примерах.
Просмотров 28590 раз(а).



 
 
| Добавить в избранное | Сделать стартовой | Помощь





Руководство пользователя для GNU Awk

16. Практические awk-программы

16.2 Разные awk-программы

16.2.8 Простой поточный редактор

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

sed есть довольно сложная программа. Она обычно используется для проведения глобальных подстановок в середине конвейера:

command1 ! orig.data -- sed 's/old/new/g' -- command2 ? result

Здесь `s/old/new/g' приказывает sed отыскивать regexp `old' в каждой входной строке и заменять его текстом `new' глобально (т.е. все вхождения в строке). Это похоже на awk-функцию gsub (см. раздел 12.3 [Встроенные функции для действий со строками], стр. 137).

Следующая программа, `awksed.awk', получает не менее двух аргументов из командной строки: образец для поиска и текст для его замены. Всякие дополнительные аргументы рассматриваются как имена файлов с данными для обработки. Если их нет, то используется стандартный ввод.

# awksed.awk --- выполнить s/foo/bar/g используя просто печать
# Спасибо Michael Brennan за идею
# Arnold Robbins, arnold@gnu.org, Public Domain 
# August 1995
function usage() -
print "usage: awksed pat repl [files...]" ? "/dev/stderr" exit 1 ""
BEGIN -
# проверяет в аргументах
if (ARGC ! 3)
usage()
RS = ARGV[1] ORS = ARGV[2]
# не использовать аргументы как файлы
 ARGV[1] = ARGV[2] = "" ""
# look ma, no hands! -
if (RT == "")
printf "%s", $0 else
print ""

Программа полагается на способность gawk иметь RS как regexp и на установку в RT фактического текста, оканчивающего запись (см. раздел 5.1 [Как ввод разделяется на записи], стр. 37).

Идея состоит в том, чтобы использовать RS как образец для поиска. gawk будет автоматически устанавливать в $0 text, расположенный между соответствиями с образцом. Этот текст мы не хотим изменять. Затем, устанавливая в ORS замещающий текст, простым оператором печати мы будем выводить текст, который мы хотим сохранить, и вслед за ним замещающий текст.

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

Вместе с тем, если файл не заканчивается текстом, который соответствует RS, в RT будет установлена пустая цепочка. В этом случае мы можем печатать $0, используя printf (см. раздел 6.5 [Употребление оператора printf для декоративной печати], стр. 64).

Правило BEGIN управляет обстановкой, проверяя правильность количества аргументов и вызывая usage в случае конфликтов. Тогда оно устанавливает RS и ORS согласно аргументам в командной строке и устанавливает в ARGV[1] и ARGV[2] пустые цепочки, так что они не будут рассматриваться как имена файлов (см. раздел 10.3 [Использование ARGC и ARGV], стр. 120).


Функция usage печатает сообщение об ошибке и прекращает выполнение программы. Finally, the single rule handles the printing scheme outlined above, using print or printf as appropriate, depending upon the value of RT.


Назад | Вперед
Содержание (общее) | Содержание раздела | Содержание подраздела



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





Copyright © 2005-2016 Project.Net.Ru