Примеры Bash Sed

Bash Sed Examples



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

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

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







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



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



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





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

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

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



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

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

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

sed -n '$ p'-

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

sed '10q'-

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

sed -n '1p'-

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

sed -А также 's/0//g'-

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

sed -А также 'с /, / т / г'-

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

sed '$ a ---'-

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

sed '1i ---'-

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

sed -n -А также 'п'-

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

sed -n -А также '/ ^ 1 / p'-

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

sed -А также '/ ^ 1 / d'-

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

sed -n -А также '$ ='-

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

sed $ {1}'-

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

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

Команды

тройник ()
{
тестовое задание $ {#} -экв 1 || возвращение;
sed $ {1}'-
}
главный()
тройникэто;
Котэто

главный

Выход

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 -А также '$ ='-
};
функциялиния печати()
{
sed -n -А также '$ {1}п'-
};
темп= $( mktemp );
Кот-> $ {temp};
Кот $ {temp} |print-line $((СЛУЧАЙНЫЙ%$( Кот $ {temp} |lc)+1 ));
rm $ {temp}
}

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

seq 100 |_

Выход (1)

35 год

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

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

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

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

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

Команды

линия печати()
{
sed -n '$ {1}п'-
}

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

Команды

слова|линия печатипятьдесят

Выход

пятьдесят

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

Команды

объявлять -xfслова
объявлять -xfлиния печати
seq 1 10$(слова| Туалет - ) | xargsтрепать -c слова | строка печати {} '

Выход

1
одиннадцать
21
31 год
41 год
51
61
71
81 год
91

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

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

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

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

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

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

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

Команды

тест-сед-версия-максимум() {
выбросил -n | sed 'v$ {1}'-2> /разработчик/нулевой
}
пробная версия()
{
выбросил -n 'Версия$ {1}. Хорошо. Сделай это ';
тест-сед-версия-максимум$ {1} && {
выбросил -n 'Старый';
правда
} || {
выбросил -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 -А также 's/]*.//g'-
}
завиток https://linuxhint.com/bash_cut_command/ --тихий |стрип-теги

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

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

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

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

  1. найти
  2. рукоятка
  3. sed
найти

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

найти -типж-имя | рукоятка -v-А также| xargs-я ...

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

найти -типж-имя*.php| рукоятка -v -А также '.идти' | xargs ...

Узнайте больше о команде xargs в bash.

рукоятка

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

найти -типж-имя*.php| рукоятка -v -А также '.идти' |
xargs рукоятка -А такжеsome_pattern-или

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

sed

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

найти -типж-имя*.php| рукоятка -v -А также '.идти' |
xargs sed -А такжеs/some_pattern/замена/грамм

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Сортировать
  • голова
  • хвост
  • рукоятка
  • Кот
  • NS
  • тройник

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

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

Коткакой-то файл| Сортировать -| голова -1

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

Коткакой-то файл| Сортировать | голова -1

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

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

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

Команды

слова()
{
seq 100
}
бар()
{
выбросил ---
}
старый PHP()
{
выбросил 'ereg ($ UA,' Боттибот ')'
}

Нижняя линия

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