- Linux вывести диапазон строк
- Основные команды Sed
- Удалить что-то из файла
- Сделать замену
- Экранирование символов в sed
- Два условия одновременно в Sed
- Получить диапазон строк
- Заменить всё между определёнными символами
- Создать функцию
- Отбросить всё, что левее определённого слова
- Отбросить всё, что правее определённого слова
- Удаление переходов на новую строку
- Удалить всё после определённой строки
- Linux вывести диапазон строк
- Примечания
Linux вывести диапазон строк
Вам могут пригодится также статьи AWK и GREP
Примеры я показываю в Bash под Windows 10 или в Bash в Linux .
Основные команды Sed
Для того чтобы применить SED достаточно ввести в командную строку
echo ice | sed s / ice / fire /
Обратите внимание на то, что использовать / не обязательно.
Вы можете после s поставить какой-то другой символ, например : или , или |
Результат будет тем же, главное, чтобы все три разделителя были одинаковыми и сам символ был без дополнительных смыслов.
echo mice | sed s / m / r /
echo mice | sed s , m , r ,
echo mice | sed s : m : r :
Если вы выбрали |, то команду нужно взять в кавычки — у | есть особая роль в bash — pipeline
Если вы редактируете пути до файлов (а они содержат /) то это как раз тот случай, когда удобно выбрать другой разделитель
Например, нужно заменить /bin/bash на /bin/sh
Намного удобнее использовать @ как разделитель чем экранировать каждый слеш.
Сравните две идентичные команды
sed ‘s @ /bin/bash @ /bin/sh @ ‘ /etc/passwd
sed ‘s / \ /bin \ /bash / \ /bin \ /sh / ‘ /etc/passwd
Удалить что-то из файла
За удаление отвечает опция d про неё вы можете прочитать отдельную статью sed d
Также можно удалять заменой на пустое место
И удалять с помощью других опций, например, q
Сделать замену
За замену отвечает опция s про неё вы можете прочитать отдельную статью sed s — substitute
Экранирование символов в sed
Специальные символы экранируются с помощью \
Что включать в специальные символы зависит от того, какой sed вы используете, но $.*[\^ а также пробелы и кавычки советую экранировать всегда.
Пробел также можно заменять на \s
. в регулярных выражениях обозначает один любой символ кроме начала новой строки \n поэтому, если вы хотите написать url используйте \
Пример экранирования точек и кавычек для смены локали в CentOS можете изучить здесь
Предположим, что есть файл input.txt следующего содержания
Here is a String / it has a Name Here is an Integer / it has a Name Here is a Float it / has a Name
Мы хотим отбросить всё, что находится левее /a, включая /a, и записать в файл.
В результате получим ошибку
-e expression #1, char 15: unknown option to `s’
Чтобы команда заработала нужно добавить \ перед /
Here is a String Here is an Integer Here is a Float
Экранирование пробелов может пригодиться при замене одной фразы на другую
Чтобы в скрипте sites.sh из директории /opt/andrei/scripts/ заменить фразу Bike website topbicycle.ru на Travel website heihei.ru нужно выполнить
sed -i s/Bike \ website \ topbicycle.ru/Travel \ website \ heihei.ru/ /opt/andrei/scripts/sites.sh
Два условия одновременно в Sed
Предположим, что у нас есть файл input.txt следующего содержания
Here is a String /b it has a Name Here is an Integer /b it has a Name Here is a Float /b it has a Name
Мы хотим отбросить всё, что находится левее /b, включая /b, и всё, что правее has.
Таким образом, в каждой строчке должно остаться только слово it.
Нужно учесть необходимость экранирования специального символа / а также мы хотим направить вывод в файл.
sed ‘s/^.*\/b// ; s/has.*//’ input.txt > output.txt
Получить диапазон строк
В случае, когда Вы работаете с большими файлами, например с логами, часто бывает нужно получить только определённые строки, например, в момент появления бага.
Копировать из UI командной строки не всегда удобно, но если Вы примерно представляете диапазон нужных строк — можно скопировать только их и записать в отдельный файл.
Например, Вам нужны строки с 9570 по 9721
sed -n ‘9570,9721p;9722q’ project-2019-10-03.log > bugFound.txt
Заменить всё между определёнными символами
Удалить всё что находится между квадратными скобками включая скобки
sed ‘s/\[.*\]//’ input.txt > output.txt
Создать функцию
Чтобы каждый раз не вспоминать команды sed можно создать функцию
Возьмём команду, которая удаляет комментарии и пустые строки из предыдущего примера и запишем как функцию clean_file.
Первым делом в коносли нужно написать в терминале function clean_file < и нажать Enter
Затем ввести выражение sed -i ‘/^#/d ; /^$/d’ $1
$1 означает, что функция будет принимать один аргумент. Это, конечно, будет название файла.
Затем нужно снова нажать Enter и в новой строке написать > и нажать Enter ещё раз
$ function clean_file < >sed -i ‘/^#/d;/^$/d’ $1 > >
Убедитесь, что файл содержит комментарии и пустые строки. Если нет — создайте для чистоты эксперимента.
clean_file websites
cat websites
Отбросить всё, что левее определённого слова
Предположим, что у нас есть файл input.txt следующего содержания
Here is a String it has a Name Here is an Integer it has a Name Here is a Float it has a Name
Мы хотим отбросить всё, что находится левее слова it, включая слово it, и записать в файл.
sed ‘s/^.*it//’ input.txt > output.txt
^ означает, что мы стартуем с начала строки Результат:
Для доступности объясню синтаксис сравнив две команды. Посмотрите внимательно, когда мы заменяем слово Here на There.
There находится между двумя слэшами. Раскрашу их для наглядности в зелёный и красный.
sed ‘s/Here/There/‘
А когда мы хотим удалить что-то, мы сначала описываем, что мы хотим удалить. Например, всё от начала строки до слова it.
Теперь в правой части условия, где раньше была величина на замену, мы ничего не пишем, т.е. заменяем на пустое место. Надеюсь, логика понятна.
sed ‘s/^.*it//‘ > output.txt
Отбросить всё, что правее определённого слова
Предположим, что у нас есть файл input.txt следующего содержания
Here is a String / it has a Name Here is an Integer / it has a Name Here is a Float / it has a Name
Мы хотим отбросить всё, что находится правее слова is, включая слово is, и записать в файл.
Удаление переходов на новую строку
Удалить всё после определённой строки
Допустим Вы хотите удалить все строки после третьей
sed 3q input.txt > output.txt
Linux вывести диапазон строк
В этом приложении содержится очень краткое описание приемов работы с утилитами обработки текста sed и awk. Здесь будут рассмотрены лишь несколько базовых команд, которых, в принципе, будет достаточно, чтобы научиться понимать простейшие конструкции sed и awk внутри сценариев на языке командной оболочки. sed: неинтерактивный редактор текстовых файлов awk: язык обработки шаблонов с C-подобным синтаксисом При всех своих различиях, эти две утилиты обладают похожим синтаксисом, они обе умеют работать с регулярными выражениями, обе, по-умолчанию, читают данные с устройства stdin и обе выводят результат обработки на устройство stdout. Обе являются утилитами UNIX-систем, и прекрасно могут взаимодействовать между собой. Вывод от одной может быть перенаправлен, по конвейеру, на вход другой. Их комбинирование придает сценариям, на языке командной оболочки, мощь и гибкость языка Perl.
Таблица B-1. Основные операции sed
Операция | Название | Описание |
---|---|---|
[диапазон строк]/p | Печать [указанного диапазона строк] | |
[диапазон строк]/d | delete | Удалить [указанный диапазон строк] |
s/pattern1/pattern2/ | substitute | Заменить первое встреченное соответствие шаблону pattern1, в строке, на pattern2 |
[диапазон строк]/s/pattern1/pattern2/ | substitute | Заменить первое встреченное соответствие шаблону pattern1, на pattern2, в указанном диапазоне строк |
[диапазон строк]/y/pattern1/pattern2/ | transform | заменить любые символы из шаблона pattern1 на соответствующие символы из pattern2, в указанном диапазоне строк (эквивалент команды tr) |
g | global | Операция выполняется над всеми найденными соответствиями внутри каждой из заданных строк |
Без оператора g ( global ), операция замены будет производиться только для первого найденного совпадения, с заданным шаблоном, в каждой строке. |
sed -e '/^$/d' $filename # Ключ -e говорит о том, что далее следует строка, которая должна интерпретироваться #+ как набор инструкций редактирования. # (При передаче одной инструкции, ключ "-e" является необязательным.) # "Строгие" кавычки ('') предотвращают интерпретацию символов регулярного выражения, #+ как специальных символов, командным интерпретатором. # # Действия производятся над строками, содержащимися в файле $filename.
В отдельных случаях, команды редактирования не работают в одиночных кавычках.
filename=file1.txt pattern=BEGIN sed "/^$pattern/d" "$filename" # Результат вполне предсказуем. # sed '/^$pattern/d' "$filename" дает иной результат. # В данном случае, в "строгих" кавычках (' . '), #+ не происходит подстановки значения переменной "$pattern".
Sed использует ключ -e для того, чтобы определить, что следующая строка является инструкцией, или набором инструкций, редактирования. Если инструкция является единственной, то использование этого ключа не является обязательным. |
sed -n '/xzy/p' $filename # Ключ -n заставляет sed вывести только те строки, которые совпадают с указанным шаблоном. # В противном случае (без ключа -n), будут выведены все строки. # Здесь, ключ -e не является обязательным, поскольку здесь стоит единственная команда.
Таблица B-2. Примеры операций в sed
Операция | Описание |
---|---|
8d | Удалить 8-ю строку. |
/^$/d | Удалить все пустые строки. |
1,/^$/d | Удалить все строки до первой пустой строки, включительно. |
/Jones/p | Вывести строки, содержащие «Jones» (с ключом -n ). |
s/Windows/Linux/ | В каждой строке, заменить первое встретившееся слово «Windows» на слово «Linux» . |
s/BSOD/stability/g | В каждой строке, заменить все встретившиеся слова «BSOD» на «stability» . |
s/ *$// | Удалить все пробелы в конце каждой строки. |
s/00*/0/g | Заменить все последовательности ведущих нулей одним символом «0». |
/GUI/d | Удалить все строки, содержащие «GUI» . |
s/GUI//g | Удалить все найденные «GUI» , оставляя остальную часть строки без изменений. |
Замена строки пустой строкой, эквивалентна удалению части строки, совпадающей с шаблоном. Остальная часть строки остается без изменений. Например, s/GUI//, изменит следующую строку
The most important parts of any application are its GUI and sound effects
The most important parts of any application are its and sound effects
Символ обратного слэша представляет символ перевода строки, как символ замены. В этом случае, замещающее выражение продолжается на следующей строке.
Эта инструкция заменит начальные пробелы в строке на символ перевода строки. Ожидаемый результат — замена отступов в начале параграфа пустыми строками.
Указание диапазона строк, предшествующее одной, или более, инструкции может потребовать заключения инструкций в фигурные скобки, с соответствующими символами перевода строки.
В этом случае будут удалены только первые из нескольких, идущих подряд, пустых строк. Это может использоваться для установки однострочных интервалов в файле, оставляя, при этом, пустые строки между параграфами.
Быстрый способ установки двойных межстрочных интервалов в текстовых файлах — sed G filename. |
- Пример 33-1
- Пример 33-2
- Пример 12-2
- Пример A-3
- Пример 12-12
- Пример 12-20
- Пример A-13
- Пример A-19
- Пример 12-24
- Пример 10-9
- Пример 12-33
- Пример A-2
- Пример 12-10
- Пример 12-8
- Пример A-11
- Пример 17-11
Примечания
Если адресное пространство не указано, то, по-умолчанию, к обработке принимаются все строки.