$put_perv_real = "/home/www/dvakompa-ru/dopol/"; ?>
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 файл
При написании bash скриптов мы используем переменные. Иногда возникает необходимость использовать эти переменные в выражениях sed.
Самый простой подход - использование двойных кавычек для обертки выражения:
sed "s/$var1/$var2/g"
Двойные кавычки не сработают, есть в $var1 или $var2 присутвствуют спецсимволы. Лучше всего - исключать переменные из обертки:
sed 's/'"$var1"'/'"$var2"'/g'