Поиск по сайту:

6 способов найти и заменить текст в терминале Linux


Быстрые ссылки

  • Используйте команду sed
  • Заменить текст с помощью команды awk
  • Замена текста в режиме Vim Ex
  • Использование Bash-скрипта
  • Заменить набор символов командой tr
  • Использование перла

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

Используйте команду sed

Хотите быструю замену текста? Используйте команду sed. С помощью sed вы можете искать и изменять текст в файлах, обрабатывая все: от простых замен до сложных манипуляций с текстом.

Допустим, у вас есть файл с именем example.txt, содержащий слово «Linux», и вы решили заменить его на «Windows». Для этого запустите:

sed 's/Linux/Windows/g' example.txt

Здесь флаг s означает замену, а флаг g позволяет sed заменять все вхождения шаблона в каждой строке.

Предыдущая команда не изменяет исходный файл напрямую; он показывает только измененный вывод в терминале. Однако если вы хотите напрямую манипулировать исходным файлом, используйте флаг -i:

sed -i 's/Linux/Windows/g' example.txt

Флаг -i вносит изменения непосредственно в файл, а не только отображает выходные данные.

Хотите создать резервную копию файла перед внесением изменений? Добавьте расширение к флагу -i:

sed -i.bak 's/Linux/Windows/g' example.txt

Перед внесением каких-либо изменений будет создан файл резервной копии с именем example.txt.bak.

Но что, если вы хотите, чтобы исходный файл остался неизменным? Вы можете создать новый файл и сохранить там измененный вывод, используя оператор перенаправления.

Например, чтобы отправить вывод в отдельный файл, используйте:

sed 's/Linux/Windows/g' example.txt > file.txt

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

sed -i 's/Linux\|Ubuntu/Windows/g' example.txt

Уловка, которую я часто использую с sed, — это переключение на другой разделитель, если мои строки поиска или замены содержат косую черту. Например, когда я работаю с путями к файлам, мне нравится использовать символ @ в качестве разделителя:

sed 's@old/path@new/path@g' file.txt

Это упрощает чтение команды и позволяет избежать необходимости использования большого количества escape-символов.

Заменить текст с помощью команды awk

Как и sed, awk также выполняет простые и сложные манипуляции с текстом. Я часто использую awk для обработки структурированных данных, особенно с файлами CSV, где могут потребоваться вычисления по выбранным полям.

Хотя awk хорошо известен благодаря управлению структурированными данными, он также эффективен для быстрого поиска и замены. Например, чтобы заменить определенный текст в файле, вы можете использовать:

awk '{gsub(/Windows/, "Linux"); print}' file.txt > new_file.txt

Здесь функция gsub выполняет глобальную замену, заменяя каждое вхождение слова «Windows» на «Linux» в каждой строке файла. Поскольку awk не изменяет файлы напрямую, мы перенаправляем вывод в new_file.txt, чтобы зафиксировать изменения.

Я также использую awk для очистки экспорта данных, особенно из электронных таблиц, где дополнительное форматирование может усложнить обработку данных. Многие экспортированные таблицы содержат значения в кавычках, что может нарушить обработку данных в других приложениях.

Вы можете удалить все двойные кавычки из первого столбца файла CSV с помощью этой команды:

awk -F, '{gsub(/"/, "", $1); print}' data.csv > cleaned_data.csv

Здесь gsub удаляет все двойные кавычки только из первого столбца, а выходные данные перенаправляются в файл clean_data.csv для дальнейшего использования.

Замена текста в режиме Vim Ex

Хотите быстро преобразовать текст, не открывая полноценный редактор? Попробуйте Vim (Vi Improved), текстовый редактор с режимом Ex, который позволяет выполнять операции поиска и замены непосредственно из командной строки.

Для начала откройте файл с помощью Vim:

vim filename.txt

Затем войдите в режим Ex, нажав Esc, а затем воспользуйтесь клавишей (:). В нижней части терминала появится двоеточие (:), указывающее, что вы находитесь в режиме Ex. Чтобы найти и заменить текст, используйте эту команду:

:%s/macOS/Linux/g

Эта команда заменяет все вхождения «macOS» на «Linux» во всем файле. Символ % указывает, что команда должна применяться ко всему файлу, а флаг g в конце обеспечивает замену всех вхождений в каждой строке, а не только первого.

Чтобы заменить только первое вхождение в каждой строке, просто опустите флаг g:

:%s/macOS/Linux/

Нужно заменить текст в определенном диапазоне строк? Укажите диапазон строк. Например, чтобы заменить текст со строки 3 на строку 10:

:3,10s/macOS/Linux/g

Одна из моих привычек при внесении изменений в файлы — подтверждать каждую замену. Такой подход позволяет осуществлять тщательное построчное редактирование.

Чтобы получить подсказку для каждой замены, добавьте c в конце команды:

:%s/macOS/Linux/gc

Использование Bash-скрипта

Иногда вам может потребоваться выполнить серию операций поиска и замены в нескольких файлах или каталогах. В этих случаях использование сценариев Bash может автоматизировать задачи, выполнение которых вручную заняло бы много времени.

Давайте рассмотрим простой скрипт, который заменяет старую строку новой строкой в нескольких текстовых файлах в текущем каталоге:

#!/bin/bash
for file in *.txt; do
    sed -i 's/Windows/Linux/g' "$file"
done

Чтобы использовать этот сценарий, сначала сохраните его в файле (например, basexexample.sh), затем сделайте файл исполняемым, запустив:

chmod +x bashexample.sh

Затем выполните скрипт с помощью:

./bashexample.sh

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

Заменить текст скриптом Python

Благодаря расширенным возможностям обработки текста Python вы можете выполнять задачи поиска и замены файлов непосредственно из терминала. Скрипты Python полезны, если вам нужны более сложные операции, например обработка нескольких файлов с условной логикой.

Сначала создайте новый файл Python. Вы можете использовать любой текстовый редактор, например nano или Vim:

vim textfile.py

Затем добавьте в файл следующий скрипт Python:

#!/usr/bin/env python
import sys
with open(sys.argv[1], 'r+') as f:
    content = f.read().replace('Windows', 'Linux')
    f.seek(0)
    f.write(content)
    f.truncate()

После сохранения файла сделайте его исполняемым, выполнив:

chmod +x ./testfile.py

Затем запустите сценарий, передав целевой файл в качестве аргумента командной строки:

python3 ./testfile.py input.txt

Этот сценарий считывает содержимое input.txt, заменяет вхождения старого текста новым текстом и сохраняет изменения непосредственно в файл.

Заменить набор символов командой tr

Вам когда-нибудь приходилось заменять один символ другим символом во всем файле? Если да, то вам нужно попробовать команду tr. Эта команда идеально подходит для простой замены или удаления символов.

Например, я часто использую его для преобразования определенных символов в текстовом файле в верхний или нижний регистр. Чтобы заменить все строчные буквы A и D на прописные A и D в текстовом файле, запустите:

tr 'a,d' 'A,D' < example.txt

Помните, что tr работает с символами, а не со строками или словами, поэтому он лучше всего подходит для простых замен символов, а не для более сложных шаблонов.

Вы также можете очистить пробелы или стандартизировать окончания строк, выполнив это:

cat messy_file.txt | tr '\r' '\n' > clean_file.txt

Это преобразует окончания строк в стиле Windows (\r\n) в окончания строк в стиле Unix (\n), что полезно при работе с файлами в разных операционных системах.

Использование перла

Perl, язык программирования высокого уровня, также можно использовать непосредственно в терминале для поиска и замены текста, что делает его отличной альтернативой sed. Его синтаксис аналогичен синтаксису sed, но предлагает более продвинутые функции.

Лично мне очень понравился Perl из-за его особенно мощных возможностей регулярных выражений, которые делают его отличным выбором для сложных операций поиска и замены.

Вы можете заменить любое слово в файле с помощью этой команды:

perl -pi -e 's/Linux/Windows/g' file.txt

Здесь флаги -pi сообщают Perl о необходимости редактировать файл на месте, а флаг -e позволяет передавать выражение напрямую. Эта команда изменяет файл file.txt, заменяя «Linux» на «Windows» во всем файле.


Для простых замен хорошо подходят инструменты командной строки, такие как sed, awk или perl. Выберите сценарий Bash или Python, если вам нужно выполнить более сложную замену в нескольких файлах или с дополнительной логикой.

Статьи по данной тематике: