Книга: Искусство программирования на языке сценариев командной оболочки
B.1. Sed
B.1. Sed
Sed -- это неинтерактивный строчный редактор. Он принимает текст либо с устройства stdin, либо из текстового файла, выполняет некоторые операции над строками и затем выводит результат на устройство stdout или в файл. Как правило, в сценариях, sed используется в конвейерной обработке данных, совместно с другими командами и утилитами.
Sed определяет, по заданному адресному пространству, над какими строками следует выполнить операции[ 66 ]. Адресное пространство строк задается либо их порядковыми номерами, либо шаблоном. Например, команда 3d заставит sed удалить третью строку, а команда /windows/d означает, что все строки, содержащие "windows", должны быть удалены.
Из всего разнообразия операций, мы остановимся на трех, используемых наиболее часто. Это p -- печать (на stdout), d -- удаление и s -- замена.
Таблица B-1. Основные операции sed
Операция | Название | Описание |
---|---|---|
[диапазон строк]/p | Печать [указанного диапазона строк] | |
[диапазон строк]/d | delete | Удалить [указанный диапазон строк] |
s/pattern1/pattern2/ | substitute | Заменить первое встреченное соответствие шаблону pattern1, в строке, на pattern2 |
[диапазон строк]/s/pattern1/pattern2/ | substitute | Заменить первое встреченное соответствие шаблону pattern1, на pattern2, в указанном диапазоне строк |
[диапазон строк]/y/pattern1/pattern2/ | transform | заменить любые символы из шаблона pattern1 на соответствующие символы из pattern2, в указанном диапазоне строк (эквивалент команды tr) |
g | global | Операция выполняется над всеми найденными соответствиями внутри каждой из заданных строк |
В отдельных случаях, операции sed необходимо заключать в кавычки.
sed -e '/^$/d' $filename
# Ключ -e говорит о том, что далее следует строка, которая должна интерпретироваться
#+ как набор инструкций редактирования.
# (При передаче одной инструкции, ключ "-e" является необязательным.)
# "Строгие" кавычки ('') предотвращают интерпретацию символов регулярного выражения,
#+ как специальных символов, командным интерпретатором.
#
# Действия производятся над строками, содержащимися в файле $filename.
В отдельных случаях, команды редактирования не работают в одиночных кавычках.
filename=file1.txt
pattern=BEGIN
sed "/^$pattern/d" "$filename" # Результат вполне предсказуем.
# sed '/^$pattern/d' "$filename" дает иной результат.
# В данном случае, в "строгих" кавычках (' ... '),
#+ не происходит подстановки значения переменной "$pattern".
sed -n '/xzy/p' $filename
# Ключ -n заставляет sed вывести только те строки, которые совпадают с указанным шаблоном.
# В противном случае (без ключа -n), будут выведены все строки.
# Здесь, ключ -e не является обязательным, поскольку здесь стоит единственная команда.
Таблица B-2. Примеры операций в sed
Операция | Описание |
---|---|
8d | Удалить 8-ю строку. |
/^$/d | Удалить все пустые строки. |
1,/^$/d | Удалить все строки до первой пустой строки, включительно. |
/Jones/p | Вывести строки, содержащие "Jones" (с ключом -n). |
s/Windows/Linux/ | В каждой строке, заменить первое встретившееся слово "Windows" на слово "Linux". |
s/BSOD/stability/g | В каждой строке, заменить все встретившиеся слова "BSOD" на "stability". |
s/ *$// | Удалить все пробелы в конце каждой строки. |
s/00*/0/g | Заменить все последовательности ведущих нулей одним символом "0". |
/GUI/d | Удалить все строки, содержащие "GUI". |
s/GUI//g | Удалить все найденные "GUI", оставляя остальную часть строки без изменений. |
Замена строки пустой строкой, эквивалентна удалению части строки, совпадающей с шаблоном. Остальная часть строки остается без изменений. Например, s/GUI//, изменит следующую строку
The most important parts of any application are its GUI and sound effects
на
The most important parts of any application are its and sound effects
Символ обратного слэша представляет символ перевода строки, как символ замены. В этом случае, замещающее выражение продолжается на следующей строке.
s/^ */
/g
Эта инструкция заменит начальные пробелы в строке на символ перевода строки. Ожидаемый результат -- замена отступов в начале параграфа пустыми строками.
Указание диапазона строк, предшествующее одной, или более, инструкции может потребовать заключения инструкций в фигурные скобки, с соответствующими символами перевода строки.
/[0-9A-Za-z]/,/^$/{
/^$/d
}
В этом случае будут удалены только первые из нескольких, идущих подряд, пустых строк. Это может использоваться для установки однострочных интервалов в файле, оставляя, при этом, пустые строки между параграфами.
Примеры использования sed в сценариях командной оболочки, вы найдете в:
1. Пример 33-1
2. Пример 33-2
3. Пример 12-2
4. Пример A-3
5. Пример 12-12
6. Пример 12-20
7. Пример A-13
8. Пример A-19
9. Пример 12-24
10. Пример 10-9
11. Пример 12-33
12. Пример A-2
13. Пример 12-10
14. Пример 12-8
15. Пример A-11
16. Пример 17-11
Ссылки на дополнительные сведения о sed, вы найдете в разделе Литература.
- About the author
- Conventions used in this document
- Chapter 12. Debugging your scripts
- Chapter 16. Commercial products based on Linux, iptables and netfilter
- Terms used in this document
- What NAT is used for and basic terms and expressions
- System tools used for debugging
- 4.3 Потоковый редактор sed
- Working with Compressed Files
- Text-Based Console Login
- GUI-Based Printer Configuration Quick Start
- Console-Based Monitoring