9 способов редактирования текста с помощью команды sed в Linux
Одним из основных инструментов для редактирования текста в Linux является sed, потоковый редактор. Это текстовый редактор без интерфейса, который выполняет операции тихо, прямо из командной строки. От быстрых исправлений до сложных преобразований текста, вот девять способов, как команда sed упрощает редактирование.
1. Найти и заменить текст (базовый и целенаправленный)
Замена текста — это самое распространенное применение sed. Я использую его чаще всего при работе с большими файлами в терминале, потому что не хочу открывать отдельный текстовый редактор только для поиска и замены текста. Запуск sed непосредственно из терминала не только увеличивает мою эффективность и скорость, но и предоставляет больше возможностей настройки, чем обычный диалог поиска и замены.
Основной синтаксис для поиска и замены текста прост.
sed 's/old/new/' file.txt
Здесь команда s означает замену, old — это текст, который вы ищете (Flameshot в моем случае), а new — это текст, на который вы хотите его заменить (например, Gradia).
По умолчанию sed заменяет только первое вхождение на каждой строке. Однако во многих ситуациях вам нужно заменить все вхождения целевого слова. Для этого добавьте глобальный флаг g в конце:
sed 's/old/new/g' file.txt
Теперь каждое вхождение в каждой строке заменяется.
Вы также можете заменить текст на конкретной строке, указав номер строки перед опцией s:
sed '10s/old/new/' file.txt
Эта команда заменяет старый текст на новый текст только в строке 10. Аналогично, вы можете заменить текст в диапазоне строк, указав номера начальной и конечной строки, разделенные запятой, перед флагом s:
sed '10,20s/old/new/' file.txt
Помимо замены, специфичной для строки, вы можете быть еще более избирательными, сказав sed действовать только в том случае, если строка соответствует определенному шаблону:
sed '/ERROR/s/old/new/g' file.txt
Таким образом, sed заменяет текст только в строках, которые соответствуют шаблону (например, ERROR в данном случае), оставляя остальные нетронутыми.
2. Вставка, добавление и удаление содержимого
Работая с файлами, три задачи, которые я выполняю наиболее часто, это вставка, добавление и удаление содержимого. С помощью sed я могу справляться со всеми тремя задачами эффективно и плавно, не открывая файл в редакторе.
Давайте начнем с вставки. С помощью sed вы можете добавлять содержимое в любое место файла — до или после определенной строки. Например, если вы работаете с любым конфигурационным файлом и хотите добавить новую настройку перед третьей строкой, вы можете сделать это с помощью флага i:
sed '3i # New setting ENABLE_FEATURE=true' config.conf
Аналогично, если вы хотите, чтобы текст появился после 10-й строки, просто замените i на a:
sed '3a Added text' file.txt
Легкий способ запомнить это — думать о "i" как о вставке перед, а "a" как о добавлении после.
Иногда проще заменить целую строку, чем редактировать ее части. Для этого используйте опцию c. Например, если у вас есть файл свойств с номером версии и вы хотите его обновить, вы можете заменить целую строку:
sed '/^version=/cversion=2.0.0' config.conf
Эта команда удаляет старую строку и записывает вашу новую на её месте.
Если вы хотите полностью удалить строку, не добавляя ничего нового, используйте опцию d:
sed '3d' file.txt
Это удаляет строку 3. Кроме того, вы также можете вырезать блок строк, указав диапазон, как это:
sed '5,10d' file.txt
Это очищает строки с 5 по 10.
Точно так же, как раньше, когда мы использовали сопоставление шаблонов для поиска и замены содержимого, мы также можем использовать sed для удаления на основе шаблонов. Например, если файл журнала содержит тысячи записей DEBUG, вы можете удалить их все сразу:
sed '/DEBUG/d' logfile.txt
Эти команды могут показаться устрашающими вначале, но как только вы начнете их использовать, вы быстро сможете выполнять эти базовые операции всего лишь несколькими нажатиями клавиш.
3. Отображение и извлечение содержимого
По умолчанию sed выводит каждую строку, которую он обрабатывает, что может быть подавляющим, особенно с журналами или конфигурационными файлами. Чтобы контролировать это, мы используем опцию -n, которая говорит sed оставаться тихим, если мы явно не попросим его что-то показать. Совмещение этого с командой p (для печати) дает нам полный контроль над тем, что отображается.
Например, чтобы распечатать 5-ю строку указанного файла, используйте:
sed -n '5p' file.txt
Вы также можете выбрать определенные диапазоны строк. Например, чтобы напечатать строки с 15 по 20, выполните:
sed -n '15,20p' file.txt
Аналогичным образом, если вы ищете конкретное слово или шаблон, например, ошибки, зарытые в тысячах строк, используйте это:
sed -n '/ERROR/p' file.txt
Здесь sed ищет любые строки, содержащие слово ERROR, и выводит только эти строки. Это похоже на выполнение grep, но непосредственно внутри sed, что удобно при объединении нескольких операций.
Еще одним мощным примером является извлечение фрагментов текста между двумя маркерами. Представьте, что вы отлаживаете системный журнал и хотите получить только раздел между НАЧАЛОМ и КОНЦОМ:
sed -n '/START/,/END/p' file.txt
Эта команда действует как умный маркер, выделяя все между этими ключевыми словами. Чтобы инвертировать совпадение, просто используйте опцию ! вот так:
sed -n '/ERROR/!p' logfile.txt
Это выводит все строки, кроме тех, которые содержат ERROR, позволяя вам сосредоточиться на чистом выводе и игнорировать шум.
4. Модификация файлов на месте с опциями резервного копирования
Все, что делает sed, безопасно: он просто выводит результаты в терминал, оставляя ваши исходные файлы нетронутыми. Однако в конечном итоге вы можете захотеть внести постоянные изменения. С помощью опции -i вы можете редактировать файл на месте:
sed -i 's/old/new/g' file.txt
Это заменяет каждое упоминание старого на новое напрямую в вашем текстовом файле. Никакой переадресации, никаких дополнительных файлов, просто мгновенное обновление. Но вот в чем дело: это немедленно перезаписывает файл, без кнопки отмены.
Чтобы создать резервную копию оригинального файла, используйте -i с суффиксом для резервной копии:
sed -i.bak 's/old/new/g' file.txt
Теперь sed создает копию оригинала как file.txt.bak перед внесением изменений. Если что-то пойдет не так, вы можете быстро вернуться назад. Вы даже можете выбрать собственные суффиксы:
sed -i.backup 's/temporary/permanent/g' file.txt sed -i.$(date +%Y%m%d) 's/foo/bar/g' config.conf
Первая команда создает file.txt.backup, в то время как вторая создает резервную копию с временной меткой, трюк, который я использую при итерации по конфигурациям, позволяя мне отслеживать, какая версия пришла из какого дня.
5. Примените несколько изменений одновременно
Иногда одного изменения недостаточно. Вам может потребоваться очистить набор данных, стандартизировать метки или отредактировать файл конфигурации, где требуется несколько изменений. Запуск sed несколько раз работает, но это неэффективно. Вместо этого вы можете объединить изменения вместе, чтобы файл сканировался только один раз.
Например, чтобы сделать два замещения за один проход, используйте несколько флагов e:
sed -i -e 's/apple/orange/g' -e 's/pear/grape/g' file.txt
Здесь яблоко становится апельсином, а груша становится виноградом. Для более компактного стиля вы можете объединять команды в одну строку, отделяя их точкой с запятой:
sed 's/red/blue/g; s/apple/orange/g; /draft/d' data.txt
Эта версия заменяет цвета, меняет местами названия фруктов и удаляет любые строки, содержащие слово ‘черновик’. Она работает так же, но по мере накопления правок читаемость страдает. Вот тогда перемещение команд в отдельный файл сценария помогает.
6. Автоматизация редактирования с помощью скриптов
Если у вас есть периодические задачи по очистке, например, проект с несколькими сотнями файлов, содержащими незначительные ошибки форматирования, такие как лишние символы, несогласованные термины или случайные комментарии. В этот момент стоит автоматизировать процесс. Вместо того чтобы вставлять строки в ваш терминал, сохраните свои изменения в файл сценария и применяйте их к любому тексту, который вам нужен.
Например, создайте edits.sed с этими строками:
s/apple/orange/g s/pear/grape/g /^#/d
Теперь вы можете запустить всё сразу с помощью:
sed -i -f edits.sed file.txt
С помощью одной команды sed применяет все ваши изменения за один проход к указанному файлу. Однако вам потребуется потратить некоторое время на создание правил edits.sed для файлов, которые вы хотите изменить.
7. Редактирование текста с использованием регулярных выражений (Regex)
Регулярные выражения (regex) описывают шаблоны, а не буквальный текст. Это означает, что вы можете нацеливаться на формы данных, такие как слово, за которым следует число, или любой текст в конце строки, а не только на точные слова. На первый взгляд регулярные выражения выглядят устрашающе, но как только вы узнаете несколько основ, это кажется словно у вас есть швейцарский армейский нож для манипуляции текстом.
Регулярные выражения не только для очистки текста — они также помогают вам выявлять шаблоны и формировать способ работы с данными. Некоторые ключевые символы включают:
- ^и $ соответствуют тексту в начале или в конце строки.
- Квадратные скобки, такие как [0-9], соответствуют любому digit, а [aeiouAEIOU] помогают вам находить или удалять гласные.
- Точка . обозначает любой отдельный символ.
- * и + позволяют вам повторять шаблоны столько раз, сколько вам нужно.
Регулярные выражения могут быть довольно сложными, но даже изучение нескольких основ открывает множество возможностей с такими инструментами, как sed.
Возьмите эту команду, которая меняет местами имя и фамилию:
sed -E 's/^([A-Za-z]+)[[:space:]]+([A-Za-z]+)$/2, 1/' names.txt
Если ваш файл выглядит так:
John Doe Jane Smith
Тогда вывод будет выглядеть так:
Doe, John Smith, Jane
Регулярные выражения также решают проблемы согласованности, такие как добавление нуля к однозначным цифрам или удаление пробелов в конце из журналов и файлов CSV:
sed -E 's/b([0-9])b/01/g' numbers.txt #add a leading zero sed -E 's/[[:space:]]+$//' file.txt #removing trailing spaces
8. Очистка и форматирование текстовых файлов
Неаккуратные файлы появляются все время — особенно когда они поступают из Windows, Excel или автоматически сгенерированных экспортов. sed быстро очищает эти данные, чтобы вы могли читать, делиться ими или легче использовать в скриптах.
Классический пример связан с линейными окончаниями в Windows. Если вы откроете файл Windows на Linux и увидите дополнительные ^M -символы, это возврат перевозки r. Вы можете удалить дополнительную возврату каретки в конце каждой линии с этим:
sed -i 's/r$//' file.txt
Табы — это еще одна распространенная неприятность. Чтобы стандартизировать всё на пробелы, вы можете использовать это:
sed -E 's/t/ /g' file.txt
Кроме того, пробелы проникают повсюду — пустые строки, лишние пробелы или несогласованное расстояние между словами. sed легко справляется с этим с помощью следующих команд:
sed -E '/^[[:space:]]*$/d' file.txt sed -E 's/[[:space:]]+$//' file.txt sed -E 's/[[:space:]]+/ /g' file.txt
Здесь первая команда удаляет пустые строки, вторая удаляет лишние пробелы по краям, а последняя сжимает несколько пробелов в один для аккуратного и ровного текста.
9. Объединить с другими командами
Еще одна вещь, которая мне нравится в sed, это его способность легко взаимодействовать с другими командами Bash. Он обрезает вывод, извлекает информацию, сравнивает обработанные файлы и применяет изменения к многим файлам — все это с помощью быстрых однострочных команд или в больших скриптах.
Например, команда ps aux обычно выводит больше, чем вам нужно. Но передача этого вывода в sed оставит только первые пять строк:
ps aux | sed -n '1,5p'
Вы также можете комбинировать grep с sed для извлечения конкретной информации. Например, если у вас есть журнал, полный сообщений об ошибках с отметками времени в квадратных скобках, используйте это, чтобы извлечь только отметки времени:
grep 'ERROR' logfile | sed -E 's/.*[([0-9-: ]+)].*/1/p'
Это всего лишь несколько примеров. Вы можете комбинировать sed с diff, find, xargs и многими другими. Он изменяет сложные текстовые потоки, так что следующая команда может выполнять свою работу лучше.
От простых операций поиска и замены до сложных преобразований с использованием регулярных выражений, sed предлагает решения, которые экономят бесчисленные часы ручной работы. Однако, как и с любой командой Linux, ключ к овладению ей — это ежедневная практика. Используйте его часто, и вскоре это станет для вас вторым естеством.







Добавить комментарий