Замена одной подстроки на другую в shell-скрипте
У меня есть строка firstString = "I love Suzi and Marry"
, и я хочу заменить в ней "Suzi" на "Sara".
Вот код, который у меня есть:
firstString = "I love Suzi and Marry"
secondString = "Sara"
Я хочу получить следующий результат:
firstString = "I love Sara and Marry"
Как мне правильно выполнить эту замену?
5 ответ(ов)
Для Dash все предыдущие решения не работают.
Совместимое с POSIX решение на sh
выглядит следующим образом:
result=$(echo "$firstString" | sed "s/Suzi/$secondString/")
Этот код заменит первое вхождение на каждой строке ввода. Чтобы заменить все вхождения, добавьте флаг /g
:
result=$(echo "$firstString" | sed "s/Suzi/$secondString/g")
Команда echo [string] | sed "s|[original]|[target]|g"
выполняет замену в строке, где:
s
означает "заменить"g
означает "глобально, все совпадения"
Таким образом, данная команда принимает [string] как входящие данные, ищет все вхождения подстроки
[original]и заменяет их на
[target]`.
Поскольку я не могу оставить комментарий, отвечаю здесь. @ruaka Чтобы сделать пример более читабельным, запишите его так:
full_string="I love Suzy and Mary"
search_string="Suzy"
replace_string="Sara"
my_string=${full_string/$search_string/$replace_string}
или
my_string=${full_string/Suzy/Sarah}
Таким образом, вы сможете заменить search_string
на replace_string
в строке full_string
.
Чтобы заменить первое вхождение шаблона с использованием специальных символов в Bash, вы можете использовать следующий синтаксис:
Для замены первого вхождения:
${parameter/pattern/string}
Для замены всех вхождений:
${parameter//pattern/string}
В вашем примере кода, если вы хотите заменить первое вхождение //Suzi//
на значение переменной secondString
, вам нужно выполнить следующую операцию:
firstString="I love //Suzi// and Marry"
secondString="Sara"
firstString="${firstString/\/\/Suzi\/\//"$secondString"}"
echo $firstString
После выполнения этого кода вывод будет: I love Sara and Marry
.
Обратите внимание, что //
в вашем шаблоне экранированы с помощью \
для корректной замены.
Я думаю, что это самый чистый способ для вашего случая:
firstString="${firstString//Suzi/$secondString}"
Этот код заменяет все вхождения строки "Suzi" в переменной firstString
на значение переменной secondString
.
Как выводить команды оболочки по мере их выполнения
Назначение значений по умолчанию для переменных оболочки одной командой в bash
Как указать приватный SSH-ключ для выполнения команды shell в Git?
Как сделать паузу в shell-скрипте на одну секунду перед продолжением?
Как использовать 'grep' для непрерывного потока?