sed


| Следующая

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'