Готовый перевод sed & awk / sed & awk: 4.4 Четыре вида sed скриптов
В этом разделе, мы рассмотрим четыре типа скриптов, каждый из которых демонстрирует типичные приложения sed.
4.4.1 Множественное редактирование одного файла
Первый тип скриптов демонстрирует производство серии изменений в файле. Например, мы используем скрипт для конвертирования файла, созданного в программе обработке текста, в файле закодированном для troff.
Однажды один из авторов писал проект для компьютерной компании, здесь называется BigOne Computer. Документ должен включать краткое описание продукта для "Horsefeathers Software". Компания пообещала, что описание продукта будет онлайн и они отправят его. К несчастью, когда файл пришел, он содержал единственный вариант предоставления - форматированый вывод для принтера. Часть файла (сохраненная для тестов и названная horsefeathers) предоставлена далее.
HORSEFEATHERS SOFTWARE PRODUCT BULLETIN
DESCRIPTION
+ ___________
BigOne Computer offers three software packages from the suite
of Horsefeathers software products -- Horsefeathers Business
BASIC, BASIC Librarian, and LIDO. These software products can
fill your requirements for powerful, sophisticated,
general-purpose business software providing you with a base for
software customization or development.
Horsefeathers BASIC is BASIC optimized for use on the BigOne
machine with UNIX or MS-DOS operating systems. BASIC Librarian
is a full screen program editor, which also provides the ability
Обратите внимание, что в текст добавлены пробелы между словами. Так же пробелы добавлены для создания отступа слева.
Мы решили, что прежде, чем мы попробуем найти решение этой проблемы с помощью sed - лучше мысленно состовить список действий, которые мы собираемся предпринять. КОгда мы начали писать код, мы написали скрипт, который содержал всего одну команду и должен был выполнить только одну вещь. Првоерили, что он работает и добавили ещё одну команду и повторяли этот процесс до тех пор, пока не добились желаемых результатов. ...
Этот процесс работы может показать утомительным, и действительно существуют сценарии где это уместно взять и написать весь скрипт за раз и затем начать его тестировать. Обычно, техника один-шаг-за-раз высоко рекомендована для новичков потому, что изолируется каждая команда и проще увидеть, что работает, а что нет. Когда Вы пробуете сделать несколько команд за раз, можно обнаружить, что в случае возникновения проблемы Вы воссоздаете рекомендованный процесс в обратном направлении; удаляя команды по одной до нахождения проблемы.
Вот список очевидных редактирований, которые должны быть сделаны для описания Horsefeathers Software:
1. Заменить все пустые строка на пункт макроса (.LP).
2. Удалить все начальные пробелы из каждой строки
3. Удалить подчеркивающую линию для принтера, которая начинается с "+"
4. Удалить множественные пробелы добавленные между строк.
Первое редактирование требует найти пустые строки. Как правило, при взгляде на входной файл не очевидно где пустые строки имеют предшествующие пробелы, а где нет. Как оказалось их нет, таким образом пустые строки соответствуют шаблону "^$". (Если бы были пробелы в строке, шаблон был бы написан "^*$".) Таким образом, первое редактирование довольно просто для исполнения:
s/^$/.LP/
Оно заменяет каждую пустую строку на ".LP". Обратите внимание, что мы не выделяем точку в разделе подстановки, команды замены. Мы можем поместить эту команду в файл sedscr и проверить команду следующим побразом:
$ sed -f sedscr horsefeathers
HORSEFEATHERS SOFTWARE PRODUCT BULLETIN
.LP
DESCRIPTION
+ ___________
.LP
BigOne Computer offers three software packages from the suite
of Horsefeathers software products -- Horsefeathers Business
BASIC, BASIC Librarian, and LIDO. These software products can
fill your requirements for powerful, sophisticated,
general-purpose business software providing you with a base for
software customization or development.
.LP
Horsefeathers BASIC is BASIC optimized for use on the BigOne
machine with UNIX or MS-DOS operating systems. BASIC Librarian
is a full screen program editor, which also provides the ability
Прекрастно видно, какая строка была изменена. ( Часто удобно вырезать часть файла для использования его для проверок. Это лучше работает если часть достаточно маленькая для помещения на экран и достаточно большая для влючения разных примеров того, что нужно изменить. После успешного применения редактирования на тестовом файле, вторым уровнем проверки будет, когда Вы примените его на оригинальном файле.)
Следующее редактирование, которые мы сделаем удалит строки, начинающиеся с "+" и содержащие подчеркивание. Мы можем просто удалить эти строки, используя команду удаления, d. При написании шаблона для поиска этих строк, мы имеем несколько вариантов. Каждая строка будет соответствовать:
/^+/
/^+/
/^+*/
/^+*__*/
Как можно видеть, каждое следующее регулярное выражение соответствует большему числу символов. Только через проверки можно определить насколько полно выражение соответствует указанной строке и не соответствует другим. Чем больше шаблон описанный в регулярном выражении, тем удобней понять, что он производит нежелательные совпадения. Для этого скрипта, мы выберем третье выражение:
/^+*/d
Эта команда удалит любую строку, начинающуюся со знака плюса и затем как минимум одного пробела. Шаблон описывает два пробела, но второй измене "*", что означает, что второй пробел может быть, а может и нет.
Эта команда была добавлена в sed скрипт и проверена, но поскольку она влияет только на одну строку, мы опустим результаты и продвинемся дальше. Следующее редактирование должноу удалить пробелы в начали строки. Шаблон для поиска этой последовательности очень похож на адрес из пердыдущей команды.
s/^*//
Эта команда удалит любую последовательность пробелов, найденную в начале строки. Подстановочная часть команды замены пустая означает, что найденая подстрока удаляется.
Можно добавить эту команду в скрипт и проверить его.
$ sed -f sedscr horsefeathers
HORSEFEATHERS SOFTWARE PRODUCT BULLETIN
.LP
DESCRIPTION
.LP
BigOne Computer offers three software packages from the suite
of Horsefeathers software products -- Horsefeathers Business
BASIC, BASIC Librarian, and LIDO. These software products can
fill your requirements for powerful, sophisticated,
general-purpose business software providing you with a base for
software customization or development.
.LP
Horsefeathers BASIC is BASIC optimized for use on the BigOne
machine with UNIX or MS-DOS operating systems. BASIC Librarian
is a full screen program editor, which also provides the ability
Следующие попытки редактирования обработают дополнительные пробелы для выравнивания строк. Можно написать команду замены для поиска любой строки с последовательноси пробелов и замены их на одиночный пробел.
s/*//g
Мы добавили флаг глобальности в конце команды, таким образом все вхождения, а не только первое, заменяются. Обратите внимание что, как к в предыдущем регулярном выражении, мы не указываем как много пробелов встречаем, а просто один и более. Может быть два, три или четыре пробела подряд. Не важно сколько, мы хотим сократить их до одного.
[3] Эта команда так же будет соответствовать одиночному пробелу. Но заменится на одиночный пробел, такой случай фактически не является операцией.
Давайте проверим новый скрипт:
$ sed -f sedscr horsefeathers
HORSEFEATHERS SOFTWARE PRODUCT BULLETIN
.LP
DESCRIPTION
.LP
BigOne Computer offers three software packages from the suite
of Horsefeathers software products -- Horsefeathers Business
BASIC, BASIC Librarian, and LIDO. These software products can
fill your requirements for powerful, sophisticated,
general-purpose business software providing you with a base for
software customization or development.
.LP
Horsefeathers BASIC is BASIC optimized for use on the BigOne
machine with UNIX or MS-DOS operating systems. BASIC Librarian
is a full screen program editor, which also provides the ability
Он работает как представлялось, уменьшая два или более пробелов до одного. При ближайшем рассмотрении можно заменить, что скрипт удаляет последовательность из двух пробелов после точки, места, где они могут находиться.
Мы должны усовершенствовать нашу команду замены, чтобы не заменять пробелы, за которыми следует точка. Проблема возникает в случае, если после трех пробелов идет точка и мы хотим сократить их до двух. Лучшим методом будет написать раздельные команд, которые будут обрабатывать специальные случаи с точкой, за которой следуют пробелы.
s/\.*/./g
Эта команда заменит точку, за которой следует любое количество пробелов на точку с двумя пробелами. Следует отметить, что предыдущая команда сокращает множественные пробелы до одного и только один пробел останется после точки. [4] Тем не менее, этот шаблон работает независимо от того сколько пробелов находится после точки, но по крайней мере один. (его не будет работать, например, для имени файла test.ext встречающемся в документе.) Эта команда была помещена в конец скрипта и проверена:
[4] Команда может быть упрощена до:
s/\././g
$ sed -f sedscr horsefeathers
HORSEFEATHERS SOFTWARE PRODUCT BULLETIN
.LP
DESCRIPTION
.LP
BigOne Computer offers three software packages from the suite
of Horsefeathers software products -- Horsefeathers Business
BASIC, BASIC Librarian, and LIDO. These software products can
fill your requirements for powerful, sophisticated,
general-purpose business software providing you with a base for
software customization or development.
.LP
Horsefeathers BASIC is BASIC optimized for use on the BigOne
machine with UNIX or MS-DOS operating systems. BASIC Librarian
is a full screen program editor, which also provides the ability
Он работает. Законченый скрипт:
s/^$/.LP/
/^+*/d
s/^*//
s/*//g
s/\.*/./g
Как говорилось ранее, следующим этапом проверки скрипта будет на полном файле (hf.product.bulletin), используя testsed и тщательно проверяя результаты. Когда мы довольны результатом, можно использова runsed, чтобы сделать изменения постоянными:
$ runsed hf.product.bulletin
done
Используя runsed, мы перезаписали оригинальный файл.
До того как оставим этот скрипт, поучительно отметить, что ,хотя скрипт и был написан для обработки конкретного файла, каждая команда в скрипте может быть использована снова, даже если Вы используете весь сценарий снова. Другими словами, Можно написать другой скрипт, который удаляет пустые строки или проверяет наличие двух пробелов после точки. Понимание того, как команды модгут быть повторно использованы в другой ситуации уменьшает время на разработку и тестирование новых скриптов. Это как пивец изучающий песню и добавляющий ее в свой репертуар.
4.4.2 Внесение изменений в несколько файлов
Наимболее общее использование sed это производство серии поисковов и замен на нескольких файлах. Зачастую эти скрипты обычны и не интересны, просто список команд замены, которые заменяют слово или фразу на другую. Разумеется, подобный скрипт не должен быть интересным, пока он удобный и сохраняет результат работы вручную.
Пример ,который мы рассмотрим в этой главе является преобразованием скрипта, написанного для преобразования различных компьютерных терминов в документации UNIX. Один человек обработал документацию и создал список вещей, которые должны быть изменены. Другой работник поработал над списком и создал следующий список подстановок.
s/ON switch/START switch/g
s/ON button/START switch/g
s/STANDBY switch/STOP switch/g
s/STANDBY button/STOP switch/g
s/STANDBY/STOP/g
s/[cC]abinet [Ll]ight/control panel light/g
s/core system diskettes/core system tape/g
s/TERM=542[05] /TERM=PT200 /g
s/Teletype 542[05]/BigOne PT200/g
s/542[05] terminal/PT200 terminal/g
s/Documentation Road Map/Documentation Directory/g
s/Owner\/Operator Guide/Installation and Operation Guide/g
s/AT&T 3B20 [cC]omputer/BigOne XL Computer/g
s/AT&T 3B2 [cC]omputer/BigOne XL Computer/g
s/3B2 [cC]omputer/BigOne XL Computer/g
s/3B2/BigOne XL Computer/g
Скрипт простой. Красота не в самом скрипте, а в возможности sed применить его к сотням файлов содержащих документацию. После проверки этого скрипта, можно его использовать, применяя runsed обрабатывать можноство файлов за раз.
Подобрый скрипт может сохранить огромное количество времени, но он может стать ошибкой, отнявшей много времени. Что иногда происходит, когда человек пишет скрипт, и проверяет на одной или двух сотнях файлов и решает, что проверка работы прошла успешно. В то время как он не проверил на каждом файле, важно чтобы проверочные файлы были показательны и исключительны. Запомните, что текст чрезвычайно изменчик и обычно нельзоя доверять тому, что конкретное вхождение справедливо для всех вхождений.
Использование grep очень удобно для проверки большого количества входных данных. Для примера, если хотите понять как "дискеты базовой системы" встречаются в документе, нужно искать везде и поразмышлять над результатом. Чтобы быть тщательным, следует поискать "базовая", "базовая система", "системная дискета" и "дискета" чтобы найти вхождения, разделенные множественными строками. (Следует так же использовать фразовый скрипт в Главе 6, поиск вхождений множества слов в последовательности строк). Оценка результатов является лучшим способом понять, что должен делать скрипт.
В некоторых случаях написание скрипта похоже на разработку теории, с данным конкретным набором фактов. Вы пробуете доказать истинность теории, увеличивая объем данных для проверок. Если Вы собираетесь запускать скрипт на множестве файлов, используйте testsed для запуска скрипта на небольшом количестве файлов, после проверки на небольшом примере. Затем сравните временные файлы и оригинал, чтобы убедиться в правильности предположений. Скрипи может быть неточен и можно будет внести в него изменения. Больше всего времени тратится на тестирование, что является довольно интересной работой, меньше времени тратится на решение проблем, вызванных неудачным скриптом.
4.4.3 Извлечение содержимого файла
Один из типов приложений sed используется для извлечения релевантных материалов из файла. В этом случае, функции sed, такие как grep, с такими дополнительными преимуществами, что входные данные могут быть изменены до вывода. Такой тип скриптов является хорошим кондидатом в шелл скрипты.
Вот два примера: извлечение макроопределения из макропакета и отображение наброска документа.
4.4.3.1 Извлечение макроопределения
Макросы troff определены в макропакете, обычно одиночном файле, который находится в директории, такой как /usr/lib/macros. Определение макросов troff всегда начинается со строки ".de", далее следиет опциональный пробел и одно- или двух буквенное имя макроса. Завершение определяет строка, начинающаяся с двух точек(..). Скрипт, показанный в этой главе извлекает конкретное определение макроса из макропакета. (Это избавит от поиска и открытия файла редактором и поиска строки, которую хотите исследовать.)
Первый шаг в разработке этого скрипта, написать извлечение извлечение указанного макроса, в нашем случае макрос BL (Bulleted List) в пакете -mm. [5]
[5] Мы случайно узнали, что -mm макрос не содержит пробела после команды ".de".
$ sed -n "/^\.deBL/,/^\.\.$/p" /usr/lib/macros/mmt
.deBL
.if\\n(.$<1 .)L \\n(Pin 0 1n 0 \\*(BU
.if\\n(.$=1 .LB 0\\$1 0 1 0 \\*(BU
.if\\n(.$>1 \{.ie !\w^G\\$1^G .)L \\n(Pin 0 1n 0 \\*(BU 0 1
.el.LB 0\\$1 0 1 0 \\*(BU 0 1 \}
..
Sed вызывается с опцией -n для ограничения печати всего файла. С этой опцией sed будет печатать только точные строки, указанные в команде print. Sed скрипт содержит два адреса: первый соответствует началу определения макроса ".deBL" и второй, соответствующий завершению, ".." единсвенный в строке. Обратите внимание, что точки обрабатываются буквально в двух шаблонах и выделяются бэкслешем.
Два адреса указывают диапозон строк для команды print, p. Эта способность отличает этот тип скриптов поиска от grep, который не может найти диапозон строк.
Можно взять эту команду и сделать ее более полной, поместив в шелл скрипт. Одним очевидным преимуществом создания шелл скрипта будет сохранение набранных строк. Другим преимуществом является то, что шелл скрипт может быть доработан для более широкого использования. Для примера, можно позволить пользователю подавать информацию из командной строки. В этом случае, а не строго заданное имя макроса в sed скрипте, можно испльзовать аргумент командной строки для получения. Моно сослаться на каждый аргумент командной строки в шелл скрипте по позиции: первый аргумент $1, второй $2 и т.д. Вот скрипт getmac:
#! /bin/sh
# getmac -- print mm macro definition for $1
sed -n "/^\.de$1/,/^\.\.$/p" /usr/lib/macros/mmt
Первая строка в шелл скрипте указывает, что скрипт должен быть интерпретирован в Bourne shell, использование исполняемого интерпритатора "#!" доступно во всех современных UNIX системах. Вторая строка комментарий, описывающий имя и назначение скрипта. Sed команда на третьей строке идентична предыдущему примеру, исключая "BL", замененный на "$1", переменную, представляющую первый аргумент командной строки. Обратите внимение, что необходимы двойный кавычки выделяющие sed скрипт. Одиночный кавычки не позволяют обрабатывать "$1" шеллу.
Скрипт getmac исполняется так:
$ getmac BL
Где "BL" первый аргумент командной строки. Он выдаст такой же результат, как и прошлый пример.
Этот скрипт может быть приспособлен для рабты с любым из множества макропакетов. Следующая версия getmac позволяет пользователю указать имя макропакета, как второй аргумент командной строки.
#! /bin/sh
# getmac - read macro definition for $1 from package $2
file=/usr/lib/macros/mmt
mac="$1"
case $2 in
-ms) file="/work/macros/current/tmac.s";;
-mm) file="/usr/lib/macros/mmt";;
-man) file="/usr/lib/macros/an";;
esac
sed -n "/^\.de *$mac/,/^\.\.$/p" $file
Что нового здесь, оператор case проверяет значение $2 и присваивает значение переманной файл. Заметьте, что мы присваиваем значение по-умолчанию переменной файл, если пользователь не указал макропакет, то поиск будет в макропакете -mm. Так же, для ясности и удобочитаемости, значение $1 присваивается переменной mac.
При создании этого скрипта, мы исследовали разные макропакеты в первой строке определения макроса. Макрос -ms включает пробел между ".de" и именем макроса, в то время как -mm и -man нет. К счастью, мы можетм приспособить шаблон для удовлетворения обоим случаям.
/^\.de *$mac/
После ".de" мы указали пробел, за которым идет звездочка, что означает опциональность пробела.
Этот скрипт печатает результат на стандартный вывод, но он может быть легко перенаправлен в файл, где он может стать основой для пересмотра макросов.
4.4.3.2 Создание набросков.
Наш следующий пример только извлекает информацию; он изменяет ее только для удобства чтения. Мы создали шелл скрипт названный do.outline, котороый использует sed чтобы предоставить набросок документа. Он обрабатывает строки содержащие указанные заголовки, как например такие:
.Ah "Shell Programming"
Используемый нами макропакет имеет макросы заголовков глав, названные "Se" и иерархические заголовки названные "Ah", "Bh", и "Ch". Вмакропакете -mm эти макросы могут быть "H", "H1", "H2", "H3", и т.д. Вы можете приспособить скрипт для любых макросов или тегов структуры документа. Назначение скрипта do.outline - сделать структуру более понятной, печатая заголовки в структурном формате.
Результат do.outline показан ниже:
$ do.outline ch13/sect1
CHAPTER 13 Let the Computer Do the Dirty Work
A. Shell Programming
B. Stored Commands
B. Passing Arguments to Shell Scripts
B. Conditional Execution
B. Discarding Used Arguments
B. Repetitive Execution
B. Setting Default Values
B. What We've Accomplished
Он печатает резулта на стандартный выход( разумеется не внося изменения в сами файлы).
Давайте посмотрим, как совместить этот скрипт. Скрипт должен найти строки начинающиеся со следующих макросов:
Название главы (.Se)
Название раздела (.Ah)
Название подраздела (.Bh)
Нужно сделать подстановку этих строк, заменяя макрос на текстовый маркер (А, В, для примера) и довавляя соответствующее количество пробелов (используя табуляцию) для отступа от каждого заголовка ( запомните, " " означает символ табуляции.)
Вот базовый скрипт:
sed -n '
s/^\.Se /CHAPTER /p
s/^\.Ah /A. /p
s/^\.Bh /B. /p' $*
do.outline обрабатывает все файлы, указанные в командной строке ("$*"). Опция -n указывает программу для вывода по-умолчанию. Скрипт sed содержит три команды подстановки, которые заменяют коды буквами и делатю отступы для каждой строки. Каждая команда подставновки изменена флагом р, который показывает строки, которые нужно выводить.
Когда мы протестируем скрипт, результат будет следующий:
CHAPTER "13" "Let the Computer Do the Dirty Work"
A. "Shell Programming"
B. "Stored Commands"
B. "Passing Arguments to Shell Scripts"
Аргумент выделен кавычками ,чтобы обработать макросы. Мы может написать команду подставновки для удаления кавычек.
s/"//g
Необходимо указать флаг g для обработки вхождений в одной строке. Как правило, ключевым решением является выбор места, в какую часть скрипта поместить команду. Если мы поместим ее в конец скрипта, она удалит кавычки после строк, уже отправленных на вывод. Мы поместим его в начало скрипта и изменим его для всех строк, независимо от того попадут ли строки на вывод или нет.
sed -n '
s/"//g
s/^\.Se /CHAPTER /p
s/^\.Ah /A. /p
s/^\.Bh /B. /p' $*
Сейчас этот скрипт производит результат, показанный раньше.
Можно изменить скрипт для поиска большинства типов кодов форматирования. Для примера, вот грубая версия для LaTeX файла:
sed -n '
s/[{}]//g
s/\\section/A. /p
s/\\subsection/B. /p' $*
4.4.4 Редактирование находу
Давайте сосредоточимся на приложение, которое показывает sed в качестве правильного потокового редактора, производство изменений в пайп- редактирование, которое не записывается в файл.
На печатных устройствах ( включая CRT), длинное тире набирается как пара дефисов. В типографическом наборе он печатается как длинный дефис ( - ). troff имеет специальный символ для длинного тире, но он неудобен для набора "\(em".
Следующая команда заменяет два последовательных тире на длинный тире.
s/--/\\(em/g
Мы повторяем бекслеш в строке замены для \(em, так как бекслеш имеет особое значение в sed.
Допустим в этом случае мы не хотим применять результат этой команды замены. Что если кто-то использует дефис для рисования горизонтальных линий? Мы можем усовершенствовать эту команду для исключения строк содержащих три и более последовательных пробела. Для этого используется модификатор адреса !.
/---/!s/--/\\(em/g
Понимание этого синтаксиса может занять время. Что изменилось в том, что мы используем шаблон адреса для ограничения строк, попадающих под команду замены и мы используем ! для инвертации значения шаблона. Проще говоря "Если найдена строка содержащая три последовательных тире, не применять редактирование". На всех остальных строках команда замены будет применена.
Можно использовать эту команду в скрипте, который автоматически вставляет длинные тире. Чтобы это сделать, будем использвоать sed как предобработчик для troff файлов. Файл будет обработак sed и затем передан на troff.
sed '/---/!s/--/\\(em/g' file | troff
Другими словами, sed изменяет входной фай и передает вывод напрямую в trof, без создания промежуточного файла. Изменения производятся налету и не изменяют входной файл. Можно удивиться, почему бы не сделать постоянные изменения в оригинальном файле? Причина в том, что это просто не нужно- входные данные с тем что пользователь набрал остаются неизменными, но troff продолжит производить то, что лучше подходит для набора- качественного вывода. Кроме того, так как это встроенно в большой шелл скрипт, преобразование тире в длинный тире незаметно для пользователя и не добавляет дополнительных шагов в процессе форматирования.
Мы используем шелл скрипт format, который использует sed для этих целей. Вот как скрипт выглядит:
#! /bin/sh
eqn= pic= col=
files= options= roff="ditroff -Tps"
sed="| sed '/---/!s/--/\\(em/g'"
while [ $# -gt 0 ]
do
case $1 in
-E) eqn="| eqn";;
-P) pic="| pic";;
-N) roff="nroff" col="| col" sed= ;;
-*) options="$options $1";;
*) if [ -f $1 ]
then files="$files $1"
else echo "format: $1: file not found"; exit 1
fi;;
esac
shift
done
eval "cat $files $sed | tbl $eqn $pic | $roff $options $col | lp"
Этот скрипт назначает и оценивает номер переменной (предваряемый знаком доллара) которая поступает из командной строки и отправляется для форматирования и печати документа. (Заметьте, что мы указали опцию -N для nroff, он устанавливает пустую строку в качестве переменной sed, пока мы хоти только сделать эти изменения если мы используем troff. Даже если ntroff понимает специальный символ \(em, эти изменения никак не повлияют на вывод.)
Изменение тире на длинное тире не единственное улучшение, которое мы хотим сделать, когда набираем документ. Для примера, большинство клавиатур не позволяют набрать открывающуюся и закрывающуюся кавычки (" и " вместо << и >>). В troff можно указать открывающуюся кавычку, введя два последовательных ударения или "обратных кавычек" (``), и закрывающуюся кавычку введя последовательно две одинарных кавычки (''). Мы можем использовать sed для изменения каждой двойной кавычки на пару одиночных открывающихся или закрывающихся кавычек( в зависимости от контекста), который, когда выбирается, будет производить появление правильной "двойной кавычки".
Это значительно более сложное редактирование, так как здесь множество отдельных случаем с участием знаков пунктуации, пробелов и табуляций. Наш скрипт может выглядеть так:
s/^"/``/
s/"$/''/
s/"?/''?/g
s/"?$/''?/g
s/"/``/g
s/"/''/g
s/"/``/g
s/"/''/g
s/")/'')/g
s/"]/'']/g
s/("/(``/g
s/\["/\[``/g
s/":/'':/g
s/":/'':/g
s/,"/,''/g
s/",/'',/g
s/\."/.\\\&''/g
s/"\./''.\\\&/g
s/\\(em\\^"/\\(em``/g
s/"\\(em/''\\(em/g
s/\\(em"/\\(em``/g
s/@DQ@/"/g
Первая команда замены ищет кавычки в начале строки и заменяет их на открывающуюся кавычку. Вторая команда ищет кавычки в конце строки и заменяет их на закрывающуюся кавычку. Оставшиеся команды ищут кавычки в другом контексте
Внимание! Этот перевод, возможно, ещё не готов.
Его статус: перевод редактируется
Переведено на Нотабеноиде
http://notabenoid.org/book/32181/117191
Переводчики: r0mk, setevoy
Настройки
Готово:
