sed

Примеры Bash Sed

Примеры Bash Sed
Bash позволяет выполнять замену шаблона, используя расширение переменных, например ($ var / pattern / replacement). Итак, sed вроде этого (sed -e 's / pattern / replacement /'). Однако sed - это не просто замена шаблонов в текстовых файлах.  Здесь мы заново откроем для себя sed, например, с эквивалентными командами и рабочими процессами, чтобы помочь в повседневных задачах.

Настройка для примеров sed

Вот краткое руководство по настройке для примера, которое я постараюсь не делать излишним.

«Слова» - это текстовый файл, содержащий числа от 1 до 100. Если вы не уверены в команде для ее создания, см. Функцию экспорта для xargs в команде экспорта Bash. Вы никогда не знаете, что это может быть на вашем следующем интервью по сценарию оболочки.

«Полоса» - это текстовый файл, содержащий одну строку -.

«Old-php» - это текстовый файл, содержащий строки старого PHP, которые не работают в php7 или более поздних версиях. (Подсказка: эрег)

Обратите внимание, что все функции, описанные выше, можно найти ниже в Примечании к функциям для настройки.

Примеры Sed с эквивалентными командами

В среде командной строки вы обнаружите, что для данной задачи существует несколько решений. Однако по большей части вы хотите пойти по пути, который дает наименьшее сопротивление. Вот список примеров команд sed с соответствующими эквивалентными командами, некоторые из которых будут подробно рассмотрены ниже.

1. Вывести случайную строку (эквивалент sort -R - | head -1)

sed -n "$ ((СЛУЧАЙНОЕ% 100)) p" -

2.Распечатать последнюю строку в файле (эквивалент заголовка -1 -)

sed -n '$ p' -

3. Вывести первые 10 строк файла (эквивалент head -n 10 -)

sed '10q' -

4. Распечатать первую строку файла (эквивалент хвоста -1 -)

sed -n '1p' -

5. Удалить все экземпляры символа (эквивалент tr -delete '0' -, где 0 - это символ, который мы хотим удалить)

sed -e 's / 0 // g' -

6. Преобразование файла CSV в TSV (эквивалент tr ', "\ t' -)

sed -e 'с /, / \ т / г' -

7.Добавить строку в файл (эквивалент кошачьей панели -)

sed '$ a ---' -

8. Добавить строку к файлу (эквивалентно cat - bar)

sed '1i ---' -

9. Распечатать все строки в файле (эквивалент cat -)

sed -n -e 'p' -

10. Вывести строки, соответствующие шаблону (эквивалентно grep -e '^ 1' -)

sed -n -e '/ ^ 1 / p' -

11. Удалить строки, соответствующие шаблону (эквивалентно grep -v -e '^ 1' -)

sed -e '/ ^ 1 / d' -

12. Получить количество строк в файле (эквивалент wc -l -)

sed -n -e '$ =' -

13. Запись в файл в фоновом режиме (эквивалентная команда tee)

sed "w $ 1" -

Пример использования sed для реализации команды tee

Прямо выше приведен пример с надписью «Запись в файл в фоновом режиме». Вид звуков как команда тройника. Ну это. Здесь мы подробно расскажем, как реализовать функцию замены tee в bash с помощью sed.

Команды

тройник ()

тест $ # -eq 1 || возвращаться;
sed "w $ 1" -

основной ()

seq 10 | тройник десять;
кошка десять

основной

Выход

1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10

Здесь вы увидите два списка целых чисел от 1 до 10. Первый - из команды seq. Второй получаем от кота файла, написанного на тройнике. Я знаю, что это смешно, но это работает!

Пример использования sed для печати случайной строки в файле

Предположим, мы хотим распечатать случайную строку в файле, используя bash и немного sed. Мы можем сделать это? Да мы можем! Вот как.

Реализуйте функцию, которая

  1. Получает количество строк в файле, L
  2. Генерирует случайное число от 1 до L, R
  3. Печатает R

Функция ожидает, что вход будет передан извне.

Команды

какая-то линия ()

функция lc ()

sed -n -e '$ =' -
;
функция print-line ()

sed -n -e "$ 1 p" -
;
temp = $ (mktemp);
кошка -> $ temp;
кошка $ temp | строка печати $ ((RANDOM% $ (cat $ temp | lc) + 1));
rm $ temp

Пример использования (1)

seq 100 | _

Выход (1)

35 год

Пример использования (2)

завиток https: // linuxhint.com / bash_cut_command / --silent | стрип-бирки | какой-то

См. Пример ниже, используя sed для удаления тегов HTML. Обратите внимание, что приведенный выше пример иногда возвращает пустое значение для пустых строк. В качестве упражнения его можно улучшить.

Использование sed для печати строк в файле

Предположим, вы хотите реализовать в bash функцию для вывода заданной строки в файле. Попытка напечатать одну строку в файле с помощью цикла в bash, head, tail или awk - слишком большая работа для печати строк в файле. Хорошо, что у нас есть sed. Результирующая функция с использованием sed будет следующей.

Команды

строка печати ()

sed -n "$ 1 p" -

Теперь посмотрим, что происходит, когда мы используем строку для печати на словах.

Команды

слова | print-line 50

Выход

50

Хорошо. Выглядит неплохо, но давайте попробуем что-нибудь менее тривиальное.

Команды

объявить -xf слова
объявить -xf print-line
seq 1 10 $ (слова | wc -l) | xargs -i bash -c "слова | строка печати "

Выход

1
11
21 год
31 год
41 год
51
61
71
81 год
91

Хорошо. Теперь это больше похоже на это! Вы видите, как sed можно использовать в сценарии bash, чтобы распечатать любую строку в файле.

Примеры Sed без эквивалентных команд

В среде командной строки иногда путь к решению, дающему наименьшее сопротивление, - это путь sed; в противном случае вы в конечном итоге будете выполнять больше работы, чем изначально требуется. Некоторые команды могут быть указаны ниже.

Управляйте всеми строками в сценарии оболочки

sed -e 's / ^ / # /' -
Удалить первую строку
sed -e '1d' -
Удалить последнюю строку
sed -e '$ d' -
Вставить строку перед строками, соответствующими шаблону
sed '/ 0 $ / я ---' -
Вставить строку после строк, соответствующих шаблону
sed '/ 0 $ / ---' -
Убрать HTML-теги
sed -e 's /<[^>] *.//грамм' -
Обновите ereg в старом коде php для работы на php7 или новее
sed 's / ereg (\ ([^,] * \).\ ([^)] * \)./ strpos (\ 2, \ 1) / g '
Проверьте, является ли sed более ранней, чем определенная версия
sed -e 'v 4.5 ' -

Пример ветвления версии sed в bash

Выше в примерах есть строка для проверки того, является ли sed более ранней, чем определенная версия, которую мы можем использовать для реализации ветвления версий в bash, что, как я считаю, проще, чем пытаться реализовать функцию для сравнения номеров версий из вывода sed -version. Единственная ошибка в том, что если есть более ранняя версия sed, не поддерживающая команду v, то у нас проблемы.

Команды

test-sed-version-at-most ()
эхо -n | sed "v $ 1" - 2> / dev / null

пробная версия ()

echo -n "Версия $ 1. Хорошо. Сделайте это ";
test-sed-version-at-most $ 1 &&
echo -n "старый";
правда
||
echo -n "новый"
;
эхо "путь."

основной ()

местный v;
для v в 4.4,5;
делать
пробная версия $ v;
Выполнено

основной

Выход

Версия 4.4. Хорошо. Сделай это по-старому.
Версия 4.5. Хорошо. Сделай это по-новому.

Обратите внимание, что версия sed, запущенная на моем компьютере при вводе этих символов, равна 4.4, который объяснил бы вывод выше. Также в то же время последняя версия gnu sed была 4.7, примерно на 3 года старше того, что у меня. Мой sed старый! Фактически, в sed 4.0.6, в команду версии был добавлен параметр, поэтому эта стратегия работает для любого указанного по крайней мере v4.0.6, что довольно снисходительно, учитывая, что версия была выпущена в начале 2003 года. Ты хороший.

Я немного покопался, фактически прочитал НОВОСТИ из последнего исходного кода. Версия 4.6 имеет новую функцию -debug, которая выгружает скрипт и аннотирует выходные строки. Это позволит вам переводить сценарии sed, сгенерированные функциями в bash, в каноническую форму. Прохладный! Только не забывайте, что вам нужно ветвление версии sed в bash. Вот где в игру вступает этот пример sed.

Пример функции bash с использованием sed для удаления тегов HTML

В приведенных выше примерах есть строка для удаления тегов HTML. Давайте добавим это в функцию bash и используем ее, чтобы вырезать все HTML-теги из последней статьи, которую я написал.

Команды

полосы-теги ()

sed -e 's /<[^>] *.//грамм' -

завиток https: // linuxhint.com / bash_cut_command / --silent | стрип-теги

Не могу сказать, что он идеальный, но, по крайней мере, он читается в терминале.

Примеры Sed с рабочими процессами: Пример рабочего процесса: безопасно заменить все с помощью find, grep и sed

Можно с уверенностью сказать, что изменения, сделанные с помощью sed с параметром -i, необратимы. То есть, если вы полностью не уверены, какой текст нужно заменить, вы, скорее всего, в итоге получите на один символ меньше, чем предполагалось. Вот почему в этом примере мы будем использовать sed в рабочем процессе для безопасной замены текста во всех выбранных вами файлах.

Рабочий процесс

  1. найти
  2. grep
  3. sed
найти

Здесь вы выберете файлы, подлежащие замене. Я предлагаю использовать следующую команду:

find -type f -name | grep -v -e | xargs -i…

Например, вы можете захотеть ограничить количество файлов для замены файлов PHP, исключая каталоги репозитория git, как показано ниже.

найти -тип f -имя \ *.php | grep -v -e '.мерзавец | xargs -i…

Подробнее о команде xargs в bash.

grep

Затем мы собираемся попытаться сопоставить some_pattern в файлах, выбранных следующим образом. Обратите внимание, что, поскольку мы используем параметр -o для grep, в выводе будет отображаться только соответствующая строка, если таковая имеется.

найти -тип f -имя \ *.php | grep -v -e '.мерзавец |
xargs -i grep -e some_pattern -o

Приведенная выше команда должна вернуть список строк, соответствующих some_pattern.

sed

Наконец, мы хотим заменить всю строку, соответствующую some_pattern. Для этого нам нужно преобразовать grep в sed следующим образом.

найти -тип f -имя \ *.php | grep -v -e '.мерзавец |
xargs -i sed -i -e s / some_pattern / замена / g

Команда grep становится sed -i, а параметр -o удаляется. И вот оно у вас есть.

Теперь вы можете заранее проверить, какие строки будут заменены в sed, вместо того, чтобы испытывать удачу.

Примечания к параметрам, используемым в примерах

Вот список опций, используемых в кратко обсуждаемых примерах sed.

Вариант Описание
Редактировать на месте. Если ввод - это файл (не переданный по конвейеру), результат выражений перезапишет содержимое файла.

Сед принимает один

например) sed -n…

-е означает выражение. Его параметр - это выражение на языке sed.

Сед принимает многие

например) sed -e 'expr1' -e 'expr2'…

-п Скрывает строку, на которую не влияет выражение. То есть, если выражение является оператором печати на языке sed, то строки, не включенные в оператор печати, не будут включены в вывод.

например) sed -n…

Дополнительные сведения о доступных параметрах sed см. В разделе sed -help

Завершите примечания об использовании эквивалентных команд в примерах

Следующие утилиты командной строки включены в примеры sed с эквивалентными командами.

Сноска в конце - в примере эквивалентных команд

Если вам интересно, что происходит с символом - в примере, это примечание для вас. Я добавил символ - после большинства команд в примерах, чтобы намекнуть, что мы ожидаем, что ввод будет получен через конвейер. Это,

кот какой-то файл | sort -R - | голова -1

Однако, когда присутствует команда в левой части трубы, мы можем опустить подсказку следующим образом.

кот какой-то файл | sort -R | голова -1

Вот что происходило с символом - после команд в примерах.

Примечания к функциям для настройки

Если вы ищете, вот функции настройки для приведенных выше примеров. Результат, полученный с помощью declare -f. Узнайте больше о команде declare в bash, чтобы узнать больше о ее использовании.

Команды

слова ()

seq 100

бар ()

эхо ---

старый-php ()

echo 'ereg ($ UA, "Боттибот")'

Нижняя граница

Мне нравилось писать примеры Bash sed, и я даже подобрал несколько дополнительных приемов. Sed - мощная утилита командной строки и выразительный язык для управления текстовыми файлами. Если вам понравилось изучать sed, не волнуйтесь, еще многое предстоит сделать. Сед на.

Учебник OpenTTD
OpenTTD - одна из самых популярных бизнес-симуляторов. В этой игре вам нужно создать замечательный транспортный бизнес. Тем не менее, вы начнете в нач...
SuperTuxKart для Linux
SuperTuxKart - отличная игра, созданная для того, чтобы бесплатно познакомить вас с Mario Kart в вашей системе Linux. Играть в нее довольно сложно и в...
Учебник Battle for Wesnoth
Битва за Веснот - одна из самых популярных стратегических игр с открытым исходным кодом, в которую вы можете играть сейчас. Эта игра не только очень д...