Шпаргалка по SED в Linux с примерами

В операционных системах семейства Linux есть очень полезная программа для работы с текстовыми документами - Sed. Это потоковый неинтерактивный редактор, который принимает на стандартный ввод текст, построчно просматривает его и заменяет по заданному шаблону подстроку, затем отправляет результат работы на стандартный вывод. Программа может пригодиться в случаях, когда необходимо из большого текстового файла удалить лишние знаки пробела, табуляции или же произвести множественные замены каких либо слов в строках текста.

В основе Sed лежит редактор Ed, который был первым строковым редактором в операционной системе UNIX. Ed не был интерактивным редактором (как nano или vi) и мог работать только с одной строкой текста. Поэтому для редактирования нужной части текста необходимо было указать адрес строки [address] и шаблон текста pattern, который необходимо изменить. Когда в строке нужно заменить все слова соответствующие шаблону (по умолчанию заменяется только первое найденное) выставляется flag g (global).

[address]s/pattern/replacement/flag

Sed Linux является логическим продолжением Ed и очень похож на своего предка. Но разница в том, что sed обрабатывает несколько строк текста, поочередно выполняя заданные выражения поиска и замены текста. Трудность освоения программы Sed заключается в том, что необходимо понимать как работают регулярные выражения и как они используется в sed.

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

1. Запись изменений в исходный файл

По умолчанию Sed не вносит изменения в исходный файл после обработки текста, он просто выводит сделанные изменения на консоль. Чтобы сохранить изменения в исходный файл, нужно запустить sed с параметром -i. Используя параметр с суффиксом -i[suffix] можно создать копию исходного файла с внесенными изменениями.

sed -i 's/pattern/replacement/' file.txt

С команды s (substitute) начинается выражение, выполняющее замену одного текста другим. За командой замены следуют регулярные выражения, определяющие шаблон замены pattern и подстановочное слово replacement.

2. Вывод только измененных строк

Запуск программы с параметром -n позволит подавить автоматический вывод всех обработанных строк. В инструкции, после команды замены s (substitute) с регулярным выражением, следует использовать команду печати p (print), чтобы вывести обработанные строки.

sed -n 's/pattern/replacement/p' file.txt

3. Замена всех найденных совпадений или выбранных

Sed заменяет только первое найденное в строке слово в строке. Если нужно заменить все найденные слова в строке, то в конце выражения ставится флаг g (global).

sed 's/pattern/replacement/g' file.txt

Когда нужно заменить второе или третье слово найденное в строке, то указывается порядковый номер этого совпадения то есть 2 или 3.

sed 's/pattern/replacement/3' file.txt

4. Выбор строк для обработки

В самом начале инструкции может быть указан (не обязательно) диапазон строк текста, которые должны быть изменены. Если адреса строк не указывать, то замены будут произведены во всем тексте.

Диапазон обрабатываемых строк можно указать используя номера строк текста. Например, выражение для замены слова pattern на replacement только в 4,5,6 строках текста будет выглядеть так:

sed '4,6s/pattern/replacement/' file.txt

Адрес строк может может быть определен регулярным выражением. В этом случае в качестве адресов начальной и конечной строки выступают какие-то слова или последовательности символов. Регулярное выражение должно быть заключено между слешами. Ниже приведен пример, выполняющий замену слова 'pattern' на 'replacement', начиная со строки содержащей слово 'Chapter' и во всех следующих строках, пока не встретится пустая строка. Пустая строка определяется регулярным выражением ^$ .

sed '/Chapter/,/^$/s/pattern/replacement/' file.txt

5. Несколько действий для одной строки

В кавычках можно перечислить сразу несколько инструкций для sed, разделив их точкой с запятой ; .

sed 's/pattern/replacement/g; s/apple/banana/' file.txt

Инструкции нужно заключать в фигурные кавычки когда они применяются для строк с адресами.

sed '4,6s{/pattern/replacement/g; s/apple/banana/}' file.txt

Очень длинные инструкции неудобно записывать в одну строку. Можно перечислить несколько инструкций в файле, используя параметр -f .

sed -f scriptfile file.txt

Содержимое файла с инструкциями scriptfile может выглядеть примерно так.

s/RU/Russian Federation/ 
s/СN/China/ 
s/US/United States/ 
s/FR/France/ 
s/DE/Germany/

7. Заменить строку на найденную подстроку

Для замены строки на найденную в ней подстроку (подстроки) используется конструкция состоящая из замещающих символов \( и \) для извлечения подстроки, и символа \1 для вызова извлеченной подстроки. Если извлекается 2 подстроки, то они вызываются набором символов \1 \2.

Например, нужно из строки нужно извлечь слово born и год рождения: He was born on September 17, 1985 in Moscow, Russia.  > born 1985.

sed 's/.*\(born\).*\([0-9]\{4\}\).*/\1/' file.txt

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *