Linux sed заменить текст в файле

Обновлено: 21.11.2024

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

Примечание. Мы будем использовать Linux Mint 20 для демонстрации использования команды sed для замены строки в файле. Вы также можете использовать любой другой вариант Linux, если хотите.

Использование команды sed:

Теперь мы собираемся показать вам несколько очень интересных примеров использования команды sed в Linux. Давайте посмотрим, как эта команда работает в разных сценариях.

Создание текстового файла для демонстрации:

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

Нажмите значок диспетчера файлов, расположенный на панели задач Linux Mint 20:

Теперь создайте новый текстовый файл в домашнем каталоге, щелкнув правой кнопкой мыши в любом месте, а затем выбрав параметр «Новый документ» в каскадном меню и параметр «Пустой документ» во вложенном каскадном меню. После создания текстового файла дайте ему подходящее имя. Для этого конкретного примера я назвал его sed.txt.

Дважды щелкните этот файл, чтобы открыть его, и введите любой произвольный текст, как показано на изображении ниже. Сохраните этот текстовый файл, нажав Ctrl + S, а затем закройте его.

Теперь запустите терминал в Linux Mint 20, как показано на следующем рисунке:

После запуска терминала в Linux Mint 20 вы можете последовательно просмотреть все приведенные ниже примеры.

Использование команды sed для замены всех вхождений данного слова:

Команду sed можно использовать для замены всех вхождений заданного слова в текстовом файле. Синтаксис достижения этой цели указан ниже:

Здесь вам нужно заменить FindWord словом, которое вы хотите заменить, и ReplaceWord словом, которое нужно заменить. Более того, вам также нужно заменить «файл» на имя файла, в котором вы хотите сделать эти замены. В этом сценарии я заменил FindWord на sed, а ReplaceWord на replace. Имя нашего файла было sed.txt. Это также показано на следующем изображении:

Успешное выполнение этой команды покажет вам изменения, которые произошли из-за выполнения этой команды на вашем терминале:

Использование команды sed для замены n-го вхождения заданного слова в каждой строке:

Приведенный выше сценарий был самым простым сценарием замены, однако иногда вы не хотите заменять все вхождения слова, а хотите заменить только первое, второе или n-е вхождение этого слова во всех строках. Для этого вы можете выполнить следующую команду:

Здесь вам нужно заменить FindWord словом, которое вы хотите заменить, и ReplaceWord словом, которое нужно заменить. Более того, вам также нужно заменить «файл» на имя файла, в котором вы хотите сделать эти замены. В этом сценарии я заменил FindWord replace и ReplaceWord на sed. Имя нашего файла было sed.txt. Кроме того, num относится к вхождению или позиции заменяемого слова. В продемонстрированном примере я хочу заменить первое вхождение replace на sed в каждой строке, как показано на рисунке ниже:

Успешное выполнение этой команды покажет вам изменения, которые произошли из-за выполнения этой команды на вашем терминале:

Использование команды sed для замены заданного слова в определенной строке:

Иногда вам нужно заменить данное слово только в определенной строке, а не во всем документе. Для этого вам нужно явно указать конкретный номер строки в следующей команде:

Здесь вам нужно заменить FindWord словом, которое вы хотите заменить, и ReplaceWord словом, которое нужно заменить. Более того, вам также нужно заменить «файл» на имя файла, в котором вы хотите сделать эти замены. В этом сценарии я заменил FindWord sed и ReplaceWord на replace. Имя нашего файла было sed.txt. Кроме того, вам нужно заменить LineNum номером конкретной строки, в которой вы хотите произвести замену. В этом примере мы хотели заменить sed на replace в строке номер 2 нашего файла, как показано на следующем рисунке:

Успешное выполнение этой команды покажет вам изменения, которые произошли из-за запуска этой команды на вашем терминале. Вы можете легко убедиться, что указанные изменения произошли только в строке номер 2 нашего файла, а не во всем тексте.

Вывод:

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

Об авторе

Акса Ясин

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

Вам как программисту может понадобиться работать с различными типами файлов для временного или постоянного хранения данных. Иногда вам может потребоваться заменить часть файла или изменить конкретное содержимое файла. Чтобы заменить содержимое в файле, необходимо выполнить поиск конкретной строки файла. Команда «sed» используется для замены любой строки в файле с помощью сценария bash. Эту команду можно использовать различными способами для замены содержимого файла в bash. Команду «awk» также можно использовать для замены строки в файле. В этом руководстве показано, как заменить любое строковое значение из файла с помощью сценария bash. Для демонстрации операций замены создается текстовый файл с именем Sales.txt со следующим содержимым.

Продажи.txt

Область суммы даты

01.01.2020 60000 Дакка
02.10.2020 76000 Раджшахи
03.02.2020 54000 Кхулна
04.15.2020 78000 Чандпур
17/05 /2020 45000 Богра
06.02.2020 67000 Комилла

Заменить строку в файле командой `sed`

Основной синтаксис команды `sed` для замены конкретной строки в файле приведен ниже.

Синтаксис

Каждая часть приведенного выше синтаксиса объясняется ниже.

Опция ‘-i’ используется для изменения содержимого исходного файла строкой замены, если строка поиска существует в файле.

«s» указывает на заменяющую команду.

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

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

"filename" содержит имя файла, в котором будет применяться поиск и замена.

Пример 1: заменить файл командой «sed»

В следующем сценарии текст для поиска и замены будет получен от пользователя. Если строка поиска существует в «Sales.txt», она будет заменена строкой замены. Здесь будет выполняться поиск с учетом регистра.

если [ [ $поиск ! = "" && $ заменить! знак равно затем
sed -i "s/ $search / $replace /" $filename
fi

Вывод

Пример 2. Замените файл командой «sed» с флагом «g» и «i»

Следующий скрипт будет работать так же, как и предыдущий пример, но в строке поиска будет выполняться глобальный поиск флага "g", а поиск без учета регистра будет выполняться для флага "i".

если [ [ $поиск ! = "" && $ заменить! знак равно затем
sed -i "s/ $search / $replace /gi" $1
fi

Вывод

Пример 3. Замените файл командой «sed» и совпадающим цифровым шаблоном

Следующий скрипт выполнит поиск всего числового содержимого в файле и заменит его добавлением символа «$» в начале чисел.

Вывод

Заменить строку в файле командой `awk`

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

Пример 4: заменить файл командой «awk»

Следующий сценарий сохранит обновленное содержимое в файле temp.txt, который будет переименован исходным файлом.

Вывод

Заключение

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

Об авторе

Фахмида Есмин

Я веду курсы веб-программирования. Мне нравится писать статьи или учебные пособия на различные темы в области ИТ. У меня есть канал на YouTube, на котором публикуются различные учебные пособия по Ubuntu, Windows, Word, Excel, WordPress, Magento, Laravel и т. д.: Справка Tutorials4u.

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

8 ответов 8

  • sed = Редактор потоков
  • -i = на месте (т. е. сохранить обратно в исходный файл)

Командная строка:

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

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

@Akiva Если вы включите специальные символы регулярных выражений в свой поиск, sed будет соответствовать им. Добавьте флаг -r, если вы хотите вместо этого использовать расширенные RE.

@mcExchange Если вам нужно сопоставить именно символ /, вы можете просто использовать какой-либо другой символ в качестве разделителя (например, 's_old/text_new/text_g' ). В противном случае вы можете поставить \ перед любым из $ * . [ \ ^ для получения буквального символа.

@BrianZ Что касается файловой системы, вывод sed — это новый файл с тем же именем. Это одна из часто встречающихся ошибок, которые не являются ошибками

Команда OSX sed -i '.bak' 's/original/new/g' file.txt также может быть запущена с расширением нулевой длины sed -i '' 's/original/new/g' file. .txt , который не будет создавать резервную копию.

Пользователи MacOS должны будут добавить ''" после -i в качестве параметра для -i ed.gs/2016/01/26/os-x-sed-invalid-command-code, чтобы файл был перезаписан.

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

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

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

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

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

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

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

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

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

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

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

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

Питон

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

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

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

Этот сценарий следует вызывать с аргументом командной строки input.txt. Точная команда для запуска скрипта Python с аргументом командной строки будет

Конечно, убедитесь, что ./myscript.py находится в вашем текущем рабочем каталоге, и в первую очередь убедитесь, что он установлен как исполняемый с помощью chmod +x ./myscript.py

Python также может иметь регулярные выражения, в частности, есть модуль re, который имеет функцию re.sub(), которую можно использовать для более сложных замен.

@TapajitDey Да, tr — еще один отличный инструмент, но обратите внимание, что он предназначен для замены наборов символов (например, tr abc cde переводит a в c, b в d. Это немного отличается от замены целых слов, как в случае с СЭД или питон

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

Еще один способ, который может иметь больше смысла, чем и > страут, — это использование трубок!

Действительно, это можно еще уменьшить: sed -i'.bak' -e 's/unicorn/fox/g;s/hyper/brown/g' yarly возьмет файл yarly и сделает 2 изменения на месте, в то время как делая резервную копию. Используя time bash -c "$COMMAND" для определения времени, можно предположить, что эта версия работает примерно в 5 раз быстрее.

Вы можете использовать Vim в режиме Ex:

% выбрать все строки

g заменить все экземпляры в каждой строке

x написать, если были внесены изменения (были) и выйти

С помощью команды awk gsub,

Пример:

В приведенном выше примере все единицы заменены на 0 независимо от столбца, в котором они расположены.

Если вы хотите выполнить замену в определенном столбце, сделайте следующее,

Пример:

Он заменяет 1 на 0 только в первом столбце.

sed — это потоковый редактор, в котором вы можете использовать | (конвейер) для отправки стандартных потоков (в частности, STDIN и STDOUT) через sed и их программного изменения на лету, что делает его удобным инструментом в традициях философии Unix; но также может редактировать файлы напрямую, используя параметр -i, упомянутый ниже.
Обратите внимание на следующее:

s/ используется для замены найденного выражения на asd :

/g означает «глобальный», то есть делать это для всей строки. Если вы опустите /g (с s/few/asd/ всегда должно быть три косых черты, несмотря ни на что) и немного появляется дважды в одной строке, только первые несколько заменяются на asd :

Немногие мужчины, несколько женщин, храбрые.

Смелые мужчины, несколько женщин, храбрые.

Это бывает полезно в некоторых случаях, например при изменении специальных символов в начале строк (например, при замене символов "больше чем", которые некоторые люди используют для цитирования предыдущего материала в цепочках электронной почты, горизонтальной табуляцией, а алгебраическое неравенство в кавычках остается позже). в строке нетронутой), но в вашем примере, где вы указываете, что везде встречается несколько, его следует заменить, убедитесь, что у вас есть /g .

Следующие две опции (флаги) объединены в одну, -т.е.:

Опция -i используется для редактирования файла hello.txt на месте.

Опция

-e указывает выражение/команду для выполнения, в данном случае s/ .

Примечание. Важно использовать -i -e для поиска/замены. Если вы укажете -ie , вы создадите резервную копию каждого файла с добавленной буквой «e».

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

Одной из таких проблем является необходимость найти и заменить текст, слово или строку в файле, особенно если вы работаете в серверной среде. Решение этой проблемы позволяет справиться с такими назойливыми проблемами, как обновление файла «/etc/apt/sources.list» после успешного обновления системы Linux.

Создание тестового текстового файла в Linux

Создайте текстовый файл с именем, например, «test.txt», и заполните его текстом, словом или строковыми символами. Пусть этот файл находится по тому же пути, что и ваш экземпляр терминала.

Создать текстовый файл в Linux

Мы будем использовать команду cat, чтобы гибко отмечать изменения в нашем созданном тестовом файле.

Просмотр текстового файла в Linux

Использование Sed для поиска и замены текста, слова или строки в файле

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

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

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

Ссылаясь на приведенное выше использование и синтаксис команды sed, мы можем заменить термин «LinuxShellTips» в нашем тестовом файле термином «этот сайт» следующим образом:

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

Найти и заменить Word в Linux с помощью команды Sed

Как видите, первые два слова «LinuxShellTips» заменены фразой «этот сайт».

Найти и заменить все вхождения текста, слова или строки в файле

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

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

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

Найти и заменить все вхождения Word в файле

Приведенная выше команда находит все глобальные вхождения термина «этот сайт» и заменяет его термином «LinuxShellTips».

Использование Awk для поиска и замены текста, слова или строки в файле

Если вы знакомы с утилитой командной строки awk, то знаете, что ее мощные показатели языка сценариев делают ее профессионалом в обработке текста. Системные администраторы Linux и профессиональные пользователи считают этот инструмент эффективным для извлечения данных и составления отчетов.

Синтаксис команды awk для простой операции поиска и замены выглядит следующим образом:

В приведенном выше синтаксисе awk заменит THE_OLD_TERM на THE_NEW_TERM в TARGETED_FILE и распечатает полученное содержимое файла на системном терминале.

Давайте применим практический подход:

Поиск и замена Word в Linux с помощью команды Awk

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

Читайте также: