- Как заменить строку в файле в Bash
- Заменить строку в файле командой `sed`
- Пример 1: заменить файл командой sed
- Пример 2: Замена файла командой sed с флагом g и i
- Пример 3. Замена файла командой sed и шаблоном совпадающих цифр
- Заменить строку в файле командой awk
- Пример 4: заменить файл командой awk
- Вывод
- Linux и Android
Как заменить строку в файле в Bash
Добавить в избранное
Главное меню » Linux » Как заменить строку в файле в Bash
К ак программисту вам может потребоваться работать с разными типами файлов для временного или постоянного хранения данных. Иногда вам может потребоваться заменить часть файла или изменить конкретное содержимое файла. Чтобы заменить содержимое в файле, вы должны найти конкретную строку файла. Команда sed используется для замены любой строки в файле с помощью сценария bash. Эту команду можно использовать различными способами для замены содержимого файла в bash. Команда AWK также может быть использована для замены строки в файле. В этой статье показано, как заменить любое строковое значение из файла с помощью сценария bash. Для отображения операций замены создается текстовый файл с именем Sales.txt со следующим содержимым.
Date Amount Area 01/01/2020 60000 AndreyEx 10/02/2020 76000 Maxim 21/03/2020 54000 Destroyer 15/04/2020 78000 Maria
Заменить строку в файле командой `sed`
Базовый синтаксис команды ‘sed’ для замены конкретной строки в файле приведен ниже.
sed -i 's/search_string/replace_string/' filename
Каждая часть приведенного выше синтаксиса объясняется ниже.
Параметр ‘-i‘ используется для изменения содержимого исходного файла с заменой строки, если строка поиска существует в файле.
‘s‘ указывает заменяющую команду.
search_string содержит строковое значение, которое будет искать в файле для замены.
replace_string содержит строковое значение, которое будет использоваться для замены содержимого файла, соответствующего значению search_string .
‘filename‘ содержит имя файла, в котором будет применяться поиск и замена.
Пример 1: заменить файл командой sed
В следующем скрипте текст для поиска и замены будет взят у пользователя. Если строка поиска существует в Sales.txt, она будет заменена строкой замены. Здесь будет выполняться поиск с учетом регистра.
#!/bin/bash # Присвойте имя файла filename="Sales.txt" # Возьмите строку поиска read -p "Введите строку поиска: " search # Возьмите строку замены read -p "Введите строку замены: " replace if [[ $search != "" && $replace != "" ]]; then sed -i "s/$search/$replace/" $filename fi
Пример 2: Замена файла командой sed с флагом g и i
Следующий сценарий будет работать так же, как и предыдущий пример, но в строке поиска будет производиться глобальный поиск флага «g», а поиск без учета регистра будет выполняться для флага «i».
#!/bin/bash # Взять строку поиска read -p "Введите строку поиска: " search Взять строку замены read -p "Введите строку замены: " replace if [[ $search != "" && $replace != "" ]]; then sed -i "s/$search/$replace/gi" $1 fi
Пример 3. Замена файла командой sed и шаблоном совпадающих цифр
Следующий сценарий выполнит поиск всего числового содержимого в файле и заменит содержимое, добавив символ «$» в начале чисел.
#!/bin/bash # Проверить, существует ли значение аргумента командной строки или нет if [ $1 != "" ]; then # Поиск по всей строке, содержащей цифры, и добавление $ sed -i 's/\b5\\b/$&/g' $1 fi
Заменить строку в файле командой awk
Команда awk — это еще один способ заменить строку в файле, но эта команда не может обновить исходный файл напрямую, как команда sed.
Пример 4: заменить файл командой awk
Следующий скрипт сохранит обновленное содержимое в файле temp.txt, который будет переименован в исходный файл.
#!/bin/bash # Проверить, существует ли значение аргумента командной строки или нет if [ $1 != "" ]; then # Искать во всей строке по дате awk '1' $1 > temp.txt && mv temp.txt $1 fi
Вывод
В этой статье показано, как использовать сценарии bash для замены определенных строк в файле. Задача по замене строки в файле станет для вас проще после отработки приведенных выше примеров.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Linux и Android
Довольно часто при работе с текстовыми файлами вам нужно находить и заменять строки текста в одном или нескольких файлах.
sed — это потоковый редактор. Он может выполнять основные операции с текстом над файлами и входными потоками, такими как конвейеры. С помощью sed вы можете искать, находить и заменять, вставлять и удалять слова и строки. Он поддерживает базовые и расширенные регулярные выражения, которые позволяют сопоставлять сложные шаблоны.
В этой статье мы поговорим о том, как находить и заменять строки с помощью sed. Мы также покажем вам, как выполнять рекурсивный поиск и замену.
Существует несколько версий sed, с некоторыми функциональными отличиями между ними. macOS использует версию BSD, а большинство дистрибутивов Linux поставляются с предварительно установленной GNU sed по умолчанию. Мы будем использовать версию GNU.
- -i — По умолчанию sed записывает свой вывод в стандартный вывод. Эта опция указывает sed редактировать файлы на месте. Если указано расширение (например, -i.bak), будет создана резервная копия исходного файла.
- s — Команда замены, вероятно, наиболее часто используемая команда в sed.
- / / / — Разделитель символов. Это может быть любой символ, но обычно используется символ косой черты (/).
- SEARCH_REGEX — Обычная строка или регулярное выражение для поиска.
- REPLACEMENT — Строка замены.
- g — Флаг глобальной замены. По умолчанию sed читает файл построчно и изменяет только первое вхождение SEARCH_REGEX в строке. Если указан флаг замены, будут заменены все вхождения.
- INPUTFILE — Имя файла, для которого вы хотите выполнить команду.
Давайте рассмотрим примеры использования команды sed для поиска и замены текста в файлах с некоторыми из его наиболее часто используемых опций и флагов.
123 Foo foo foo foo /bin/bash Ubuntu foobar 456
Как вы могли заметить, в предыдущем примере подстрока foo внутри строки foobar также заменяется. Если такое поведение вас не устраивает, используйте выражение «boundery» (\b) на обоих концах строки поиска. Это гарантирует, что отдельные слова не совпадут.
Чтобы сделать сопоставление с шаблоном нечувствительным к регистру, используйте флаг I. В приведенном ниже примере мы используем флаги g и I:
Если вы хотите найти и заменить строку, содержащую символ разделителя (/), вам нужно использовать обратную косую черту (\), чтобы экранировать ее. Например, чтобы заменить /bin/bash на /usr/bin/zsh, вы бы использовали следующую команду:
Более простой и читаемый вариант — использовать другой символ-разделитель. Большинство людей используют вертикальную черту (|) или двоеточие (:), но вы можете использовать любой другой символ:
Вы также можете использовать регулярные выражения. Например, чтобы найти все трехзначные числа и заменить их строкой number:
Еще одна полезная особенность sed — вы можете использовать символ амперсанда &, который соответствует подходящему шаблону. Символ может быть использован несколько раз.
И последнее, но не менее важное: всегда полезно сделать резервную копию при редактировании файла с помощью sed. Для этого просто добавтьте расширение к опции -i. Например, чтобы отредактировать файл file.txt и сохранить исходный файл как file.txt.bak, вы должны ввести:
Иногда вам нужно рекурсивно искать в каталогах файлы, содержащие заданную строку, и заменять эту строку во всех файлах. Это можно сделать с помощью таких команд, как find или grep, для рекурсивного поиска файлов в каталоге и передачи имен файлов в sed.
Следующая команда будет рекурсивно искать файлы в текущем рабочем каталоге и передавать имена файлов в sed.
Чтобы избежать проблем с файлами, содержащими пробел в их именах, используйте опцию -print0, которая указывает find печатать имя файла, с символом null после него, и направлять вывод в sed с помощью xargs -0:
Чтобы исключить каталог, используйте опцию -not -path. Например, если вы заменяете строку в локальном репозитории git, чтобы исключить все файлы, начинающиеся с точки (.), выполните:
Другой вариант — использовать команду grep для рекурсивного поиска всех файлов, содержащих заданный шаблон, а затем передать имена файлов в sed:
Хотя сначала это может показаться сложным, поиск и замена текста в файлах с помощью sed очень просты. Чтобы узнать больше о командах, опциях и флагах sed, почитайте руководство GNU sed и учебник Grymoire sed.