|
| 1 | +#!/bin/bash |
| 2 | +# Основы работы с sed |
| 3 | +# По умолчанию sed применяет указанные при вызове правила, выраженные в виде набора команд, к STDIN. Это позволяет передавать данные непосредственно sed |
| 4 | +# Ключ "s" - сокращенно от "substitute" (замена) |
| 5 | +## |
| 6 | +echo "Это тест" | sed 's/тест/другой тест/' # Вконце нужно закрывать прямым слэшем! |
| 7 | + |
| 8 | +# Обработка файла через sed |
| 9 | +# Sed не меняет данные в обрабатываемом файле. Редактор читает файл, обрабатывает прочитанное, и отправляет то, что получилось, в STDOUT |
| 10 | +## |
| 11 | +sed 's/тест/другой тест/' ./07_BASH_Sed_file # Вконце нужно закрывать прямым слэшем! |
| 12 | + |
| 13 | +# Выполнение наборов команд при вызове sed. Замена двух фрагментов текста |
| 14 | +# Для выполнения нескольких действий с данными, нужно использовать ключ -e при вызове sed |
| 15 | +## |
| 16 | +sed -e 's/Это/То/; s/тест/другой тест/' ./07_BASH_Sed_file # Все замены в одиночных кавычках, разделяются точкой с запятой (;) |
| 17 | +# При этом между окончанием команды и точкой с запятой не должно быть пробела |
| 18 | + |
| 19 | +# Можно набирать замену прямо из командной строки. После написания "sed -e '", нажать ENTER и продолжить вводить сновой строки |
| 20 | +## |
| 21 | +sed -e ' |
| 22 | +s/Это/То/ |
| 23 | +s/тест/другой тест/' ./07_BASH_Sed_file |
| 24 | + |
| 25 | +# Чтение команд из файла |
| 26 | +# Если имеется множество команд sed, с помощью которых надо обработать текст, обычно удобнее всего предварительно записать их в файл. |
| 27 | +# Для того, чтобы указать sed файл, содержащий команды, используют ключ -f |
| 28 | +# Создадим файл с командами 07_BASH_mycommands |
| 29 | +# Вызовем sed, передав редактору файл с командами и файл для обработки: "sed -f 07_BASH_mycommands 07_BASH_Sed_file" |
| 30 | +## |
| 31 | +sed -f ./07_BASH_mycommands ./07_BASH_Sed_file |
| 32 | + |
| 33 | +# Флаги команды замены |
| 34 | +# Вот что содержится в файле, и что будет получено после его обработки командой: "sed -e 's/Это/То/; s/тест/другой тест/' ./07_BASH_Sed_file2" |
| 35 | +# В файте: Это тест. Это тест хороший |
| 36 | +# Это следующий тест. Тест скрипта |
| 37 | +# На экране: То другой тест. Это тест хороший |
| 38 | +# То следующий другой тест. Тест скрипта |
| 39 | +# Команда замены нормально обрабатывает файл, состоящий из нескольких строк, но заменяются только первые вхождения искомого фрагмента текста в каждой строке |
| 40 | +# Для того, чтобы заменить все вхождения шаблона, нужно использовать соответствующий флаг |
| 41 | +# Схема записи команды замены при использовании флагов выглядит так: "sed 's/pattern/replacement/flags'" |
| 42 | +# При передаче номера учитывается порядковый номер вхождения шаблона в строку, заменено будет именно это вхождение |
| 43 | +# Флаг "g" (global) указывает на то, что нужно обработать все вхождения шаблона, имеющиеся в строке, сделать глобальную замену |
| 44 | +# Флаг "p" указывает на то, что нужно вывести содержимое исходной строки |
| 45 | +# Флаг вида "w file" указывает команде на то, что нужно записать результаты обработки текста в файл |
| 46 | +## |
| 47 | +sed 's/Это/То/2' ./07_BASH_Sed_file2 # Заменяется лишь второе вхождение искомого шаблона в каждой строке |
| 48 | +sed 's/Это/То/g' ./07_BASH_Sed_file2 # Заменяются все вхождения шаблона в тексте |
| 49 | +sed -n 's/Это/То/p' ./07_BASH_Sed_file2 # Флаг команды замены p позволяет выводить строки, в которых найдены совпадения, |
| 50 | +# при этом ключ -n, указанный при вызове sed, подавляет обычный вывод (не понятно по выводу!) |
| 51 | +sed 's/Это/То/w 07_BASH_output' ./07_BASH_Sed_file2 # обработанные строки записываются в файл, имя которого указано после "w" |
| 52 | + |
| 53 | +# Символы-разделители |
| 54 | +# Например, нужно заменить /bin/bash на /bin/csh в файле ./07_BASH_Sed_file3 |
| 55 | +## |
| 56 | +sed 's/\/bin\/bash/\/bin\/csh/' ./07_BASH_Sed_file3 |
| 57 | +# так как прямые слэши используются в роли символов-разделителей, такие же символы в передаваемых sed строках приходится экранировать |
| 58 | +# В результате страдает читаемость команды. sed позволяет нам самостоятельно задавать символы-разделители для использования их в команде замены |
| 59 | +# Разделителем считается первый символ, который будет встречен после "s" |
| 60 | +sed 's!/bin/bash!/bin/csh!' ./07_BASH_Sed_file3 |
| 61 | + |
| 62 | +# Выбор фрагментов текста для обработки |
| 63 | +# Можно задать ограничение на номера обрабатываемых строк или указать фильтр, в соответствии с которым строки нужно обработать |
| 64 | +## |
| 65 | +sed '2s/тест/другой тест/' ./07_BASH_Sed_file4 # ! Номер строки, в которой нужно произвести замену ставится ПЕРЕД "s" |
| 66 | + |
| 67 | +# Указание диапазона строк, в которых производится замена |
| 68 | +## |
| 69 | +sed '2,3s/тест/другой тест/' ./07_BASH_Sed_file4 # Номер строк, в которых нужно произвести замену, перечисляются через запятую |
| 70 | + |
| 71 | +# Произвести замену, начиная с некоторой строки до конца файла |
| 72 | +## |
| 73 | +sed '2,$s/тест/другой тест/' ./07_BASH_Sed_file4 |
| 74 | + |
| 75 | +# Обрабатывать с помощью команды замены только строки, соответствующие заданному фильтру |
| 76 | +# Например, если в строке присутствует слово "третий", заменить слово "тест" на словосочетание "совсем другой тест" |
| 77 | +## |
| 78 | +sed '/третий/s/тест/совсем другой тест/' ./07_BASH_Sed_file4 |
| 79 | + |
| 80 | +# Удаление строк |
| 81 | +# Вывести файл на экран, без третьей строки из этого файла |
| 82 | +## |
| 83 | +sed '3d' ./07_BASH_Sed_file4 |
| 84 | + |
| 85 | +# Удалить все строки и вывести на экран |
| 86 | +## |
| 87 | +sed 'd' ./07_BASH_Sed_file4 |
| 88 | + |
| 89 | +# Удалить диапазон строк с первой по вторую и вывести на экран |
| 90 | +## |
| 91 | +sed '1,2d' ./07_BASH_Sed_file4 |
| 92 | + |
| 93 | +# Удалить строки, начиная с заданной, до конца |
| 94 | +## |
| 95 | +sed '2,$d' ./07_BASH_Sed_file4 |
| 96 | + |
| 97 | +# Удалить строку, содержащую шаблон и вывести на экран |
| 98 | +## |
| 99 | +sed '/третий/d' ./07_BASH_Sed_file4\ |
| 100 | + |
| 101 | +# При вызове d можно указывать пару шаблонов — будут удалены строки, в которых встретится шаблон, и те строки, которые находятся между ними |
| 102 | +## |
| 103 | +sed '/второй/, /четвертый/d' ./07_BASH_Sed_file4\ |
| 104 | + |
| 105 | +# Вставка текста в поток |
| 106 | +# С помощью sed можно вставлять данные в текстовый поток, используя команды i и a: |
| 107 | +# Команда "i" добавляет новую строку перед заданной |
| 108 | +# Команда "a" добавляет новую строку после заданной |
| 109 | +## |
| 110 | +echo "Другой тест" | sed 'i\Самый первый тест' # Вставляет текст ДО |
| 111 | +echo "Другой тест" | sed 'a\Самый первый тест' # Вставляет текст ПОСЛЕ |
| 112 | + |
| 113 | +# Вставка текста МЕЖДУ строками |
| 114 | +# Вызовем команду "i", указав номер строки, ПЕРЕД которой надо вставить новую строку: |
| 115 | +## |
| 116 | +sed '2i\Это вставленная строка' ./07_BASH_Sed_file4 # !!! После "i", "a" и "c" ставится ОБРАТНЫЙ слэш |
| 117 | + |
| 118 | +# Вставка текста МЕЖДУ строками |
| 119 | +# Вызовем команду "a", указав номер строки, ПОСЛЕ которой надо вставить новую строку: |
| 120 | +## |
| 121 | +sed '2a\Это вставленная строка' ./07_BASH_Sed_file4 # !!! После "i", "a" и "c" ставится ОБРАТНЫЙ слэш |
| 122 | + |
| 123 | +# Замена строк |
| 124 | +# Команда "c" позволяет изменить содержимое целой строки текста в потоке данных |
| 125 | +# При её вызове нужно указать номер строки, вместо которой в поток надо добавить новые данные |
| 126 | +## |
| 127 | +sed '3c\Это ЗАМЕНЁННАЯ строка' ./07_BASH_Sed_file4 # !!! После "i", "a" и "c" ставится ОБРАТНЫЙ слэш |
| 128 | + |
| 129 | +# Если воспользоваться при вызове команды шаблоном в виде обычного текста или регулярного выражения, заменены будут все соответствующие шаблону строки |
| 130 | +## |
| 131 | +sed '/Это/c Это все ЗАМЕНЁННЫЕ строки!' ./07_BASH_Sed_file4 |
| 132 | + |
| 133 | +# Замена символов |
| 134 | +# Команда "y" работает с отдельными символами, заменяя их в соответствии с переданными ей при вызове данными |
| 135 | +## |
| 136 | +sed 'y/123/789/' ./07_BASH_Sed_file5 |
| 137 | +sed 'y/т/^/' ./07_BASH_Sed_file5 |
| 138 | +# Используя эту команду, нужно учесть, что она применяется ко всему текстовому потоку, ограничить её конкретными вхождениями символов нельзя |
| 139 | + |
| 140 | +# Вывод номеров строк |
| 141 | +## |
| 142 | +sed '=' ./07_BASH_Sed_file5 |
| 143 | + |
| 144 | +# Вывести только номера строк, соответствующих шаблону |
| 145 | +## |
| 146 | +sed -n '/тест/=' ./07_BASH_Sed_file5 |
| 147 | + |
| 148 | +# Чтение данных для вставки из файла |
| 149 | +# Для этого служит команда "r", которая позволяет вставлять в поток данные из указанного файла |
| 150 | +# При её вызове можно указать номер строки, после которой надо вставить содержимое файла, или шаблон |
| 151 | +## |
| 152 | +sed '3r ./07_BASH_Sed_file6' ./07_BASH_Sed_file5 # !!! Сначала указывается файл ОКУДА вставляется, а потом КУДА |
| 153 | + |
| 154 | +# Вставка из файла, при нахождении шаблона |
| 155 | +## |
| 156 | +sed '/тест/r ./07_BASH_Sed_file6' ./07_BASH_Sed_file5 # !!! Сначала указывается файл ОКУДА вставляется, а потом КУДА |
| 157 | +# Содержимое файла будет вставлено после каждой строки, соответствующей шаблону |
| 158 | + |
| 159 | +# Вставить содержимое файла в файл, после определенных символов |
| 160 | +## |
| 161 | +sed '/###/r ./07_BASH_Sed_file8' ./07_BASH_Sed_file7 # !!! Сначала указывается файл ОКУДА вставляется, а потом КУДА |
0 commit comments