Unix / Linux — регулярные выражения с SED

Самой полезной опцией в sed — является опция поиска и замены.

Примеры

Для первого примера, заменим каждое вхождение «пример» на «тест» в файле «dokument». sed ‘s/пример/тест/g’ dokument

ВАЖНО! В операционной системе Линукс очень важен регистр имен. Как видно из скриншота «Пример» и «пример» — это разные слова.

Дополним команду таким образом, чтобы менялось не только слово «пример», но и это же слово написанное с большой буквы. Для этого будем использовать специальные символы «\|».

sed ‘s/пример\|Пример/тест/g’ dokument

Заменим два фрагмента текста: «документ» на «файл»;  «как» на «не». Так как у нас несколько фрагментов текстов, будем использовать ключ «-е». sed -e ‘s/документ/файл/; s/как/не/’ dokument

Теперь сохраним все изменения в файл. Для это будем использовать ключ «-i» редактирования файла на месте.

sed -ie ‘s/документ/файл/; s/как/не/’ dokument

Удалим все пробелы в начале каждой строки слева. sed ‘s/^[ \t]*//’ file

Теперь удалим все пропуски в конце строки. sed ‘s/[ \t]*$//’ file

Удаление последней строки.

sed ‘$d’ file

Добавление восьми пробелов в новый файл слева от текстовой информации. Будем использовать перенаправление вывода «>»

sed ‘s/ / /’ file > newfile

Выведение строк c 3 по 5 файла «newfile».

sed -n 3,5p newfile

Выведение всего файла «newfile», кроме строк 3-5.

sed 15,18d newfile

Удалим все пустые строки и сохраним эти изменения в файле.

sed -i ‘/^$/d’ file

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

Читайте также:  Обзор iOS 14: что нового и как установить

Цикл выполнения

sed работает с двумя буферами данных: основным и вспомогательным. Изначально оба буфера пусты. Работа с этими буферами осуществляется при помощи команд:\\`h’, `H’, `x’, `g’, `G’ `D’ h — Заменить содержимое вспомогательного буфера содержимым основного H — Добавить новую строку к вспомогательному буферу и затем добавить содержимое основного буфера к содержимому вспомогательного x — Поменять содержимое обоих буферов местами g — Заменить содержимое основного буфера содержимым вспомогательного G — Добавить новую строку к основному буферу и затем добавить содержимое вспомогательного буфера к содержимому основного D — Удалить текст основного буфера до следующего символа перевода строки N — Добавить новую строку к основному буферу, затем добавить туда следующую обрабатываемую строку P — Вывести содержимое основного буфера до следующего символа перевода строки.

Адресные диапазоны sed

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

$ cat /etc/passwd | sed ‘1, 5d’ |more games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh $

Вышеуказанная команда будет применена ко всем строкам, начиная с 1 по 5. Это удалит первые пять строк.

Попробуйте следующие диапазоны адресов —

Диапазон и описание
1

‘4,10d’

Строки с 4 по 10 удаляются

2

’10, 4d»

Удаляется только 10- я строка, потому что sed не работает в обратном направлении

3

‘4 + 5d’

Это соответствует строке 4 в файле, удаляет эту строку, продолжает удалять следующие пять строк, а затем прекращает ее удаление и печатает остальные

4

‘2,5! D’

Это удаляет все, кроме начиная со 2- й до 5- й строки

5

‘1 ~ 3d’

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

6

‘2 ~ 2d’

Это говорит sed, чтобы удалить вторую строку, перешагнуть через следующую строку, удалить следующую строку и повторять, пока не будет достигнут конец файла

7

‘4,10p’

Печатаются строки с 4 по 10

8

‘4, г’

Это генерирует синтаксическую ошибку

9

’10d’

Это также приведет к ошибке синтаксиса

‘4,10d’

Строки с 4 по 10 удаляются

’10, 4d»

Удаляется только 10- я строка, потому что sed не работает в обратном направлении

‘4 + 5d’

Это соответствует строке 4 в файле, удаляет эту строку, продолжает удалять следующие пять строк, а затем прекращает ее удаление и печатает остальные

‘2,5! D’

Это удаляет все, кроме начиная со 2- й до 5- й строки

‘1 ~ 3d’

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

‘2 ~ 2d’

Это говорит sed, чтобы удалить вторую строку, перешагнуть через следующую строку, удалить следующую строку и повторять, пока не будет достигнут конец файла

‘4,10p’

Печатаются строки с 4 по 10

‘4, г’

Это генерирует синтаксическую ошибку

’10d’

Это также приведет к ошибке синтаксиса

Примечание. При использовании действия p следует использовать параметр -n, чтобы избежать повторения печати строки. Проверьте разницу между следующими двумя командами:

$ cat /etc/passwd | sed -n ‘1,3p’ Check the above command without -n as follows − $ cat /etc/passwd | sed ‘1,3p’

Выборочное удаление конкретных строк:

sed '/Iowa/,/Montana/d'

Удалить дубликаты последовательных строк файла (эмулирует “uniq”). Первая строка из двух дублирующих сохраняется, остальное удаляется.

sed '$!N; /^\(.*\)\n\1$/!P; D'

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

sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'

Удалить все строки, кроме дублирующих строк (эмулирует “uniq -d”).

sed '$!N; s/^\(.*\)\n\1$/\1/; t; D'

Удалить первые 10 строк файла

sed '1,10d'

Удалить последние строки файла

sed '$d'

Удалить последние 2 строки файла

sed 'N;$!P;$!D;$d'

Удалить последние 10 строк файла

Способ 1

sed -e :a -e '$d;N;2,10ba' -e 'P;D'

Способ 2

sed -n -e :a -e '1,10!{P;N;D;};N;ba'

Удалить каждую восьмую строку файла

Только GNU sed

gsed '0~8d'

Другие sed

sed 'n;n;n;n;n;n;n;d;'

Удалить строки, содержащие паттерн

sed '/pattern/d'

Удалить ВСЕ пустые строки из файла (то же самое что и “grep ‘.’ “)

Способ 1

sed '/^$/d'

Способ 2

sed '/./!d'

Удалить все ПОСЛЕДОВАТЕЛЬНЫЕ пустые строки из файла, кроме первой, также удаляет все пустые строки в начале и в конце файла (эмулирует “cat -s”)

Читайте также:  Как вывести список пользователей в Linux

Способ 1, позволяет 0 пустых строк вверху, 1 в EOF

sed '/./,/^$/!d'

Способ 2, позволяет 1 пустую строку вверху, 0 в EOF

sed '/^$/N;/\n$/D'

Удалить все ПОСЛЕДОВАТЕЛЬНЫЕ пустые строки из файла кроме первых двух:

sed '/^$/N;/\n$/N;//D'

Удалить все первые пустые строки в файле

sed '/./,$!d'

Удалить все конечные пустые строки в файле

sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' # works on all seds

Удалить последнюю строку каждого параграфа

sed -n '/^$/{p;h;};/./{x;/./p;}'