Шпаргалка по sed

2 minute read

Sed является потоковым редактором в UNIX-подобных операционных системах, которий используется для фильтрации и преобразования текста.

Sed можно использовать как для редактирования файлов, так и стандартного вывода програм/операций в stdout.

Стандарнтный синтаксис:

sed [опции] команды [имя файла]

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

Замена слова (root на Admin):

sed 's/root/Admin/' имя_файла

В результате содержимое файла будет выведено в stdout, а root будет заменено на Admin.
К сожалению замена будет произведена только для первого найденого root. Для того чтобы весь вывод был обработан - используйте g в выражении.

sed 's/root/Admin/g' имя_файла

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

Для выполнения нескольких операций воспользуйтесь ключем -e:

sed -e 's/root/Admin/g' -e 's/bash/sh/g' имя_файла

Замена слова только в строках содержащих нужное (заменить root на Admin в строках со словом user):

sed '/user/s/root/Admin/g' имя_файла

Для того что бы отредактировать файл используйте ключь -i:

sed -i '/user/s/root/Admin/g' имя_файла

Удаление 5-й строки

sed -i '5d' имя_файла

Чтобы сделать резервную копию оригиналльного файла воспользуйтесь -i.bak

sed -i.bak '5d' имя_файла

Удаление строки, в которую входит слово games:

sed '/games/d' имя_файла

Удаление всех пустых строк:

sed '/^$/d' имя_файла

Отображения диапазона строк (строки, начиная с первой по пятую)

sed -n '1,5p' имя_файла

Имя файла использовать не обязательно. С помощью sed можно исменять стандартный вывод.
Сравните стандартный вывод:

fd -kh

и его видоизмененный вариант:

df -kh |sed 's/%/000000/g'

Использование специальных символов:

Можно использовать спецсимволы:
^ - начало строки
$ - конец строки
. - обозначение одного символа

Полный набор не ограничен только этими тремя. Sed прекрасно понимает регулярные выражения (regular expressions).

Следующая команда заменит root на Admin в тех строках, которые начинаются с user:

sed '/^user/s/root/Admin/g' имя_файла

Следующая команда заменит root на Admin в тех строках, которые заканчиваются словом data:

sed '/data$/s/root/Admin/g' имя_файла

В том, случае если Вам нужно использовать какой-либо спецсимвол в sed ( $, ^, /, пробел, точка, ', и т.д.) его нужно экранировать с помощью \.

С помощью следующей конструкции слово root с пробелом после него будет заменено на Admin с двоеточием:

sed 's/root\ /Admin:/g' имя_файла
В случае использования символа (pipe) в качестве разделителя спецсимволы экранировать не нужно, но при этом регулярные выражения работать не будут
sed 's|root |Admin:|g' имя_файла

Регулярные выражения

Убрать все цыфры из вывода:

sed 's/\[0-9\]\[0-9\]//g'

Продублировать отсеченное значение:

sed 's/root/& &/g'

Попробуйте выполнить:

echo `123 abc` | sed 's/\[0-9\]\[0-9\]*/&-&/'

Регулярное выражение [0-9]* определят 0 или больше цыфр.
Регулярное выражение \[0-9\]\[0-9\]* определят 1 или больше цыфр.

Если Вам нужно использовать первое слово из строки текста - обзначьте его экранированой цыфрой:

sed 's/\([a-z]\*\).\*/\1/'

Проверьте сами:

echo 'abcd qwer zxc 123'| sed 's/\([a-z]\*\).\*/\1/'

Для того что бы поменять местами первое и второе слово - воспользуйтесь следующей конструкцией:

sed 's/\([a-z]\*\) \([a-z]\*\)/\2 \1/'

Пробел в левой части выражения может быть заменен на любой другой разделитель.

Для теста:

echo 'abcd qwer zxc 123'| sed -r 's/([a-z]+) ([a-z]+)/\2 \1/'

и

echo 'abcd_qwer_zxc_123'| sed -r 's/([a-z]+)_([a-z]+)/\2**_**\1/'  
echo 'abcd_qwer_zxc_123'| sed -r 's/([a-z]+)**_**([a-z]+)/\2 \1/'

Замена текства между двумя словами:

sed -ure 's/**word1**.+?**word2**/**word1**\ замена\ **word2**/g' -i файл

Использование переменных в выражениях sed

При написании bash скриптов мы используем переменные. Иногда возникает необходимость использовать эти переменные в выражениях sed.

Самый простой подход - использование двойных кавычек для обертки выражения:

sed 's/$var1/$var2/g'

Двойные кавычки не сработают, есть в $var1 или $var2 присутвствуют спецсимволы. Лучше всего - исключать переменные из обертки:

sed 's/''$var1''/''$var2''/g'

Tags:

Categories:

Updated: