Linux команда для замены

Как использовать sed для поиска и замены строки в файлах

При работе с текстовыми файлами вам часто нужно искать и заменять строки текста в одном или нескольких файлах.

sed является s Tream ред itor. Он может выполнять базовые операции с текстом над файлами и входными потоками, такими как конвейеры. С помощью sed вы можете искать, находить и заменять, вставлять и удалять слова и строки. Он поддерживает базовые и расширенные регулярные выражения, которые позволяют сопоставлять сложные шаблоны.

В этой статье мы поговорим о том, как найти и заменить строки с помощью sed . Мы также покажем вам, как выполнить рекурсивный поиск и замену.

Найти и заменить строку с помощью sed

Существует несколько версий sed с некоторыми функциональными различиями. macOS использует версию BSD, в то время как большинство дистрибутивов Linux поставляются с предустановленной по умолчанию GNU sed . Мы будем использовать версию GNU.

Общая форма поиска и замены текста с помощью sed имеет следующий вид:

  • -i — По умолчанию sed записывает свой вывод в стандартный вывод. Эта опция указывает sed редактировать файлы на месте. Если указано расширение (например, -i.bak), создается резервная копия исходного файла.
  • s — Заменяющая команда, вероятно, наиболее часто используемая команда в sed.
  • / / / — Символ-разделитель. Это может быть любой символ, но обычно используется символ косой черты ( / ).
  • SEARCH_REGEX — обычная строка или регулярное выражение для поиска.
  • REPLACEMENT — строка замены.
  • g — Флаг глобальной замены. По умолчанию sed читает файл построчно и изменяет только первое вхождение SEARCH_REGEX в строке. Если указан флаг замены, заменяются все вхождения.
  • INPUTFILE — имя файла, для которого вы хотите запустить команду.

Рекомендуется заключать аргумент в кавычки, чтобы метасимволы оболочки не расширялись.

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

В демонстрационных целях мы будем использовать следующий файл:

Если флаг g опущен, заменяется только первый экземпляр строки поиска в каждой строке:

С флагом глобальной замены sed заменяет все вхождения шаблона поиска:

Как вы могли заметить, подстрока foo внутри строки foobar также заменена в предыдущем примере. Если это нежелательное поведение, используйте выражение границы слова ( b ) на обоих концах строки поиска. Это гарантирует, что частичные слова не совпадают.

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

Если вы хотите найти и заменить строку, содержащую символ-разделитель ( / ), вам нужно будет использовать обратную косую черту ( ), чтобы избежать косой черты. Например, чтобы заменить /bin/bash на /usr/bin/zsh вы должны использовать

Более простой и понятный вариант — использовать другой символ-разделитель. Большинство людей используют вертикальную полосу ( | ) или двоеточие ( : ) , но вы можете использовать любой другой символ:

Читайте также:  Windows 10 wifi priority

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

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

Например, если вы хотите добавить фигурные скобки <> вокруг каждого трехзначного числа, введите:

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

Чтобы убедиться, что резервная копия создана, выведите список файлов с помощью команды ls :

Рекурсивный поиск и замена

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

Следующая команда будет рекурсивно искать файлы в текущем рабочем каталоге и передавать имена файлов в sed .

Чтобы избежать проблем с файлами, содержащими пробелы в своих именах, используйте параметр -print0 , который указывает find напечатать имя файла, за которым следует нулевой символ, и xargs -0 вывод в sed используя xargs -0 :

Чтобы исключить каталог, используйте параметр -not -path . Например, если вы заменяете строку в локальном репозитории git, чтобы исключить все файлы, начинающиеся с точки ( . ), Используйте:

Если вы хотите искать и заменять текст только в файлах с определенным расширением, вы будете использовать:

Другой вариант — использовать команду grep для рекурсивного поиска всех файлов, содержащих шаблон поиска, а затем передать имена файлов в sed :

Выводы

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

Чтобы узнать больше о sed команд, опций и флагов, посетить GNU СЭД руководство и Grymoire СЭД учебник .

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Источник

Команда tr в Linux

Текстом в терминале GNU/Linux управляет несколько программ. Их отличие заключается в специфике обработки данных. Объединяя результат работы этих утилит, можно совершать эффективные действия с текстовой информацией. Одной из таких программ является консольная команда tr, которая используется для замены, замещения или удаления символов из стандартного ввода, отправляя результат на стандартный вывод.

Утилита устанавливается вместе практически со всеми дистрибутивами GNU/Linux. В этой статье рассмотрим команду tr Linux, её синтаксис и применение на практике.

Синтаксис команды tr в Linux

Программа обрабатывает текст посимвольно. По умолчанию у её синтаксиса следующий вид (квадратные скобки указывают, что аргумент не обязателен):

tr [КЛЮЧ] . НАБОР1 [НАБОР2]

Всего доступно 4 ключа для уточнения операции над символами:

Ключ Длинный вариант Значение
-c, -C —complement Сначала получить дополнение НАБОРА1
-d —delete Удалить знаки из НАБОРА2, не превращать
-s —squeeze-repeats Замещать последовательность знаков, которые повторяются, из перечисленных в последнем НАБОРЕ, на один такой знак
-t —truncate-set1 Сначала сократить НАБОР1 до размеров НАБОРА2
Читайте также:  Установка windows помощью winsetupfromusb

НАБОРЫ указываются как символьные строки. В большинстве случаев символы представляют сами себя. Полный набор опций представлен в следующей таблице:

Опция Значение
\HHH Знак в восьмеричной кодировке (с трех цифр ННН)
\\ Обратный слэш
\b Забой
\f Перевод страницы
\n Начать с новой строки
\r Возврат каретки
\t Горизонтальная табуляция
\v Вертикальная табуляция
ЗНАК1-ЗНАК2 Все знаки от ЗНАК1 до ЗНАК2 в порядке возрастания
[ЗНАК*] ЗНАК заполняет НАБОР2 до длины НАБОРА1
[ЗНАК*ЧИСЛО] Указанное ЧИСЛО одинаковых ЗНАКОВ; ЧИСЛО восьмиричных, если начинается с 0
[:alnum:] Все буквы и цифры
[:alpha:] Все буквы
[:blank:] Все горизонтальные пробельные символы
[:cntrl:] Все управляющие знаки
[:digit:] Все цифры
[:graph:] Все печатаемые знаки, исключая пробел
[:lower:] Все маленькие буквы
[:print:] Все печатаемые знаки, включая пробел
[:punct:] Все знаки пунктуации
[:space:] Все вертикальные и горизонтальные пробельные знаки
[:upper:] Все большие буквы
[:xdigit:] Все шестнадцатиричные цифры
[=ЗНАК=] Все знаки, эквивалентные ЗНАКУ

Превращение осуществляется, если не указано -d для обоих НАБОРОВ. -t можно использовать только во время превращения. Если нужно, НАБОР2 будет расширен до размеров НАБОРА1 повторением последнего символа. Лишние символы НАБОРА2 будут пропущены. Гарантированно расширяются в порядке возрастания только [:lower:] и [:upper:]. Использованные символы в НАБОРЕ2 во время превращения можно применять для определения превращения регистра только в парах. -s использует последний указанный набор. Уплотнение происходит после превращения или удаления.

Примеры использования tr

1. Замена символов через аргументы

Программа по умолчанию работает со стандартным вводом/выводом.

Пример 1. Заменить все x на z.

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

Для выхода из программы нажмите Ctrl + D.

Пример 2. Удалить все буквы в нижнем регистре.

Пример 3. Уплотнить повторяющиеся буквы большого и малого регистров.

tr -s [:upper:][:lower:]

2. Работа с потоками

Команда tr может принимать на вход результат работы другой программы с использованием пайпа.

Пример 4. Вывести первые три строки файла /etc/passwd, заменив двоеточия (используемые в качестве разделителя данных) на пробелы.

head -n3 /etc/passwd | tr ‘:’ ‘ ‘

Также можно использовать перенаправление потока ввода и вывода.

Пример 5. Заменить цифры IP-адреса файла addresses2 на буквы a, и результат записать в файл addresses3.

tr 2 a addresses3

Выводы

Команда tr — это качественный инструмент для работы с символами строк в терминале GNU/Linux. С её помощью можно редактировать информацию со стандартного или перенаправленного потока ввода и выводить результат на экран или в файл.

Источник

Найти и заменить текст в файле с помощью команд

Как я могу найти и заменить определенные слова в текстовом файле, используя командную строку?

  • sed = Stream EDitor
  • -i = на месте (т.е. сохранить обратно в исходный файл)
  • s = команда замены
  • original = регулярное выражение, описывающее слово для замены (или только само слово)
  • new = текст для замены
  • g = глобальный (т.е. заменить все, а не только первое вхождение)

file.txt = имя файла

Есть несколько разных способов сделать это. Один использует sed и Regex. SED — это потоковый редактор для фильтрации и преобразования текста. Один пример выглядит следующим образом:

Другой способ , который может иметь больше смысла , чем и > strout является с трубами!

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

В этом ответе я использую простой input.txt файл, который вы можете использовать для проверки всех примеров, представленных здесь. Содержимое файла:

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

Этот небольшой скрипт не выполняет замену на месте, это означает, что вам придется сохранить новый текст в новый файл и избавиться от старого файла, или mv new.txt old.txt

Примечание: если вам интересно, почему while IFS= read -r ; do . done он используется, то в основном это способ чтения файла строка за строкой. Смотрите это для справки.

AWK, будучи утилитой обработки текста, вполне подходит для такой задачи. Он может делать простые замены и намного более сложные, основанные на регулярных выражениях . Он обеспечивает две функции: sub() и gsub() . Первый из них заменяет только первое вхождение, а второй — заменяет вхождения во всей строке. Например, если у нас есть строка one potato two potato , это будет результат:

AWK может принять входной файл в качестве аргумента, поэтому input.txt было бы легко сделать то же самое с :

В зависимости от версии AWK, которая у вас есть, она может иметь или не иметь редактирование на месте, поэтому обычная практика — сохранять и заменять новый текст. Например что-то вроде этого:

Sed — это редактор строк. Он также использует регулярные выражения, но для простых замен достаточно сделать:

Что хорошо в этом инструменте, так это то, что он имеет редактирование на месте, которое вы можете включить с -i флагом.

Perl — это еще один инструмент, который часто используется для обработки текста, но это язык общего назначения, который используется в сетях, системном администрировании, настольных приложениях и во многих других местах. Он заимствовал много концепций / функций из других языков, таких как C, sed, awk и другие. Простую замену можно сделать так:

Как и у sed, у perl также есть флаг -i.

питон

Этот язык очень универсален и также используется в самых разных приложениях. Он имеет много функций для работы со строками, среди которых есть replace() , так что если у вас есть переменная, как var=»Hello World» , вы могли бы сделать var.replace(«Hello»,»Good Morning»)

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

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

Источник

Читайте также:  Windows 64 bit трекер
Оцените статью